如何监视Java线程堆栈的内存

当在Solaris x86上的32位jvm上运行Java EE应用程序时,我得到一个OutOfMemoryError:无法创建本地线程(或类似的东西)。
这是因为根据我的理解,jvm没有足够的内存用于新线程的堆栈。

我使用JConsole和VisualVM 1.3来监视应用程序,但我不知道在这些工具中调用了什么“stackmemory”。 在VisualVM中,我可以监视heappace和permgen空间,而JConsole显示更多内存区域。 这些内存区域是否被预留用于堆栈内存? 我知道当然不是堆空间,但是permgen或non-heap(如JConsole中所称的那样)


你也可以试试JProfiler。 在JProfiler中,您可以从CPU分析视图中的线程视图和线程状态中获得提示。 这里是同样的截屏。

您也可以查看以下内容来调试您的问题:(从链接引用)如果遇到此异常,有几件事要做。

  • 使用lsof -p PID命令(Unix平台)查看此进程有多少个线程处于活动状态。
  • 确定操作系统定义的每个进程是否有最大线程数。 如果应用程序的限制太低,请尝试提高每个进程的线程限制。
  • 检查应用程序代码以确定是否存在创建线程或连接(例如LDAP连接)的代码并且不会销毁它们。 您可以转储Java线程以查看是否创建了过多的数字。
  • 如果您发现应用程序打开了太多连接,请确保应用程序创建的任何线程都已销毁。 企业应用程序(.ear)或Web应用程序(.war)在长时间运行的JVM下运行。 仅仅因为应用程序已完成并不意味着JVM进程结束。 必须让应用程序释放它分配的任何资源。 另一个解决方案是让应用程序使用线程池来管理所需的线程。
  • 你的代码的一部分可能会创建大量的线程。

    尝试在代码中使用ThreadPoolExecutor(线程池)来限制应用程序中的线程,并相应地调整线程池大小以获得更好的性能。

    链接地址: http://www.djcxy.com/p/82783.html

    上一篇: How to monitor memory for java thread stacks

    下一篇: Type of the first parameter of a member function in C++11