首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何监控java线程栈的内存

如何监控java线程栈的内存
EN

Stack Overflow用户
提问于 2010-08-19 17:23:11
回答 2查看 2.2K关注 0票数 2

当在Solaris x86上的32位jvm上运行Java应用程序时,我得到了一个OutOfMemoryError:无法创建本机线程(或类似的东西)。

据我所知,这是因为jvm没有足够的内存来容纳新线程的堆栈。

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

EN

回答 2

Stack Overflow用户

发布于 2010-08-19 18:06:12

您也可以尝试使用JProfiler。在JProfiler中,您可以从线程视图和CPU概要视图中的线程状态中获得提示。下面是相同的screencast

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

如果操作系统定义了每个进程的最大线程数,则

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

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

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

票数 0
EN

Stack Overflow用户

发布于 2021-09-16 12:54:04

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3520352

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档