【问题标题】:How to monitor memory for java thread stacks如何监视java线程堆栈的内存
【发布时间】:2010-08-19 09:23:10
【问题描述】:

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

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

【问题讨论】:

  • 机器有足够的swap吗?
  • $>swap -s 总计:已分配 1609736k 字节 + 760644k 保留 = 2370380k 已使用,57741028k 可用。我已将堆大小设置为 3072m,因此理论上 jvm 应该能够使用另外 1024mb 的非堆空间(我猜实际上要少一些)

标签: java multithreading memory monitor


【解决方案1】:

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

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

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

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

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

【讨论】:

    【解决方案2】:

    您可以通过将应用程序生成的最大线程数乘以 1024 字节来估算它。 1024字节是java线程的默认栈大小,可以通过Xss JVM参数改变。

    为避免本地内存 OOM,您可以通过减少 Java 堆(并为本地内存分配腾出空间)或减少 Java 堆栈大小(如果可以减少)来减少 JVM 内存使用量。 但是,如果您的应用程序的线程数无限增长,您必须使用池执行器对其进行限制。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-01
      • 2011-07-20
      • 2021-05-11
      • 2013-12-20
      • 2011-01-02
      • 1970-01-01
      • 2020-03-31
      • 1970-01-01
      相关资源
      最近更新 更多