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

标签 java multithreading memory monitor

在 Solaris x86 上的 32 位 jvm 上运行 Java EE 应用程序时,我收到 OutOfMemoryError:Cant create native thread(或类似的东西)。
据我了解,这是因为 jvm 没有足够的内存用于新线程的堆栈。

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

最佳答案

你也可以试试JProfiler . 在 JProfiler 中,您可以从线程 View 和 CPU 分析 View 中的线程状态获得提示。这是 screencast同样。

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

  • 使用 lsof -p PID 命令(Unix 平台)查看有多少线程 积极参与此过程。
  • 确定是否有最大值 定义的每个进程的线程数 由操作系统。如果限 对于应用来说太低了,试试 提高每个进程的线程限制。
  • 检查应用程序代码以 确定是否有代码是 创建线程或连接(例如 作为 LDAP 连接)而不是 摧毁他们。你可以倾倒 Java线程查看是否有 已创建过多数量。
  • 如果你发现连接太多 由应用程序打开,使 确保任何线程 应用程序创建被销毁。一个 企业应用程序 (.ear) 或 Web 应用程序(.war)在一个 长时间运行的 JVM。只是因为 申请完成不代表 JVM进程结束。这是 一个应用程序必须免费 它分配的任何资源。 另一种解决方案是 应用程序使用线程池 管理所需的线程。

您的部分代码可能会创建大量线程。

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

关于java - 如何监视 Java 线程堆栈的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3520352/

相关文章:

android - 从其他线程处理 UI

c# - 如何判断属性是否需要调用?

java - 多人游戏(Java 套接字写入/读取对象)

java - @Inject、@EJB、@Local、@Remote、@LocalBean 等... : confused?

c++ - 创建共享 packaged_task 接受带转发的参数

C 奇怪有趣的程序输出

image - Juicy Pixels 提示内存不足

perl - 如何追踪 mod_perl 内存泄漏?

java - Printf:Java 和 C 实现的差异

java - 实现 JTable 更新