当在Solaris x86上的32位jvm上运行Java应用程序时,我得到了一个OutOfMemoryError:无法创建本机线程(或类似的东西)。
据我所知,这是因为jvm没有足够的内存来容纳新线程的堆栈。
我同时使用JConsole和VisualVM 1.3来监控应用程序,但我不知道这些工具中的“堆栈内存”是什么。在VisualVM中,我可以监控堆空间和permgen空间,而在JConsole中,我可以显示更多的内存区域。这些内存区域中有没有为stackmemory预留的?当然,我知道它不是堆空间,但是permgen或非堆(在JConsole中称为堆)又如何呢?
发布于 2010-08-19 18:06:12
您也可以尝试使用JProfiler。在JProfiler中,您可以从线程视图和CPU概要视图中的线程状态中获得提示。下面是相同的screencast。
您还可以检查以下内容以调试您的问题:(参考链接)如果您遇到此异常,有几件事要做。
如果操作系统定义了每个进程的最大线程数,则
代码的某些部分可能会创建大量的线程。
尝试在代码中使用ThreadPoolExecutor (线程池)来限制应用程序中的线程,并相应地调整线程池大小以获得更好的性能。
发布于 2021-09-16 12:54:04
您可以通过将应用程序生成的最大线程数乘以1024字节来估计它。1024字节是java线程的默认堆栈大小,可以使用Xss JVM参数进行更改。
要避免本机内存OOM,可以通过减少Java堆(并为本机内存分配腾出空间)或减少Java堆栈大小(如果可以减少)来减少JVM内存使用量。但是,如果应用程序线程数量无限增长,则必须使用池执行器来限制线程数量。
https://stackoverflow.com/questions/3520352
复制相似问题