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

如何监视java线程堆栈的内存,java,multithreading,memory,monitor,Java,Multithreading,Memory,Monitor,在Solaris x86上的32位jvm上运行JavaEE应用程序时,我遇到了一个OutOfMemoryError:无法创建本机线程或类似的东西。 这是因为据我所知,jvm没有足够的内存来存放新线程的堆栈 我使用JConsole和VisualVM 1.3来监视应用程序,但我不知道这些工具中调用了什么stackmemory。在VisualVM中,我可以监视heapspace和permgen空间,而JConsole显示更多的内存区域。这些内存区域中是否有一个是为stackmemory预留的?我知道这

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

我使用JConsole和VisualVM 1.3来监视应用程序,但我不知道这些工具中调用了什么stackmemory。在VisualVM中,我可以监视heapspace和permgen空间,而JConsole显示更多的内存区域。这些内存区域中是否有一个是为stackmemory预留的?我知道这当然不是heapspace,但在JConsole中称为permgen或Non-heap,您也可以试试。 在JProfiler中,您可以从CPU评测视图中的线程视图和线程状态获取提示。这是同样的

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

在Unix中使用lsof-p PID命令 看看平台上有多少线程 对于此过程,您处于活动状态。 确定是否存在最大值 定义的每个进程的线程数 通过操作系统。如果限制 对于应用程序来说太低,请重试 提高每个进程线程的限制。 检查应用程序代码以 确定是否有不正确的代码 创建线程或连接,例如 作为LDAP连接,而不是 摧毁他们。你可以把垃圾倒了 Java线程,以查看是否存在 已创建过多的数字。 如果您发现连接太多 由应用程序打开,使 确保 应用程序创建被销毁。一 企业应用程序。ear或Web 应用程序。战争在 长时间运行的JVM。就因为 申请完成并不意味着 JVM进程结束。它是 应用程序必须是免费的 它分配的任何资源。 另一个解决办法是针对 应用程序使用线程池来 管理所需的线程。 代码的某些部分可能正在创建大量线程

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

您也可以尝试。 在JProfiler中,您可以从CPU评测视图中的线程视图和线程状态获取提示。这是同样的

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

在Unix中使用lsof-p PID命令 看看平台上有多少线程 对于此过程,您处于活动状态。 确定是否存在最大值 定义的每个进程的线程数 通过操作系统。如果限制 对于应用程序来说太低,请重试 提高每个进程线程的限制。 检查应用程序代码以 确定是否有不正确的代码 创建线程或连接,例如 作为LDAP连接,而不是 摧毁他们。你可以把垃圾倒了 Java线程,以查看是否存在 已创建过多的数字。 如果您发现连接太多 由应用程序打开,使 确保 应用程序创建被销毁。一 企业应用程序。ear或Web 应用程序。战争在 长时间运行的JVM。就因为 申请完成并不意味着 JVM进程结束。它是 应用程序必须是免费的 它分配的任何资源。 另一个解决办法是针对 应用程序使用线程池来 管理所需的线程。 代码的某些部分可能正在创建大量线程


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

计算机是否有足够的交换?$>交换-s总计:分配的1609736k字节+760644k保留=使用的2370380k,可用的57741028k。我已经将heapsize设置为3072m,因此jvm应该能够为非堆空间使用另一个1024mb,理论上要少一点,实际上我猜机器是否有足够的交换空间?$>swap-s总计:分配的1609736k字节+760644k保留=使用的2370380k,可用的57741028k。我已经将heapsize设置为3072m,因此jvm应该能够为非堆空间使用另外的1024mb,理论上,我想在现实中会少一点