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

时间:2010-08-19 09:23:11

标签: java multithreading memory monitor

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

我使用JConsole和VisualVM 1.3来监视应用程序,但我不知道在这些工具中调用“stackmemory”是什么。在VisualVM中,我可以监视堆空间和permgen空间,而JConsole则显示更多的内存区域。是否有任何这些内存区域用于堆栈存储?我知道它当然不是堆空间,而是permgen或非堆(在JConsole中调用)

1 个答案:

答案 0 :(得分:0)

您也可以尝试JProfiler。 在JProfiler中,您可以从CPU概要分析视图中的线程视图和线程状态获取提示。以下是screencast

您还可以检查以下内容以调试您的问题:(从链接引用)如果您遇到此异常,可以执行以下操作。

  • 使用lsof -p PID命令(Unix 平台)看看有多少线程 这个过程很活跃。
  • 确定是否有最大值 每个进程定义的线程数 由操作系统。如果限制 对于应用来说太低了,试试吧 提高每个进程的线程限制。
  • 检查应用程序代码 确定是否有代码 创建线程或连接(例如 作为LDAP连接)而不是 摧毁他们。你可以转储 Java线程,看是否有 已创建过多的数字。
  • 如果您发现连接太多 由应用程序打开,制作 确定任何线程都可以 应用程序创建被破坏。一个 企业应用程序(.ear)或Web 应用程序(.war)在a下运行 长期运行的JVM。只是因为 申请完成并不意味着 JVM进程结束。它是 一个应用程序免费的命令 它分配的任何资源。 另一个解决方案是 应用程序使用线程池 管理所需的线程。

您的代码的某些部分可能会创建许多线程。

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