我在一个应用程序(java)中看到一个在Solaris框中使用不规则内存的应用程序。当我进行线程转储时,我看到有31个“GC任务线程” ...
就像在其他Solaris盒中一样,这很奇怪,同一应用程序只有2个“GC任务线程”。
想知道是否有人在这种情况下会创建大量的GC任务线程,这会导致内存问题吗?
任何想法表示赞赏。
关于我的案例的更多背景信息:
每次我都会在同一框中同时运行两个类似的Java应用程序。我将继续向应用程序A发送请求,而不向应用程序B发送请求。因此,应用程序B应该处于非 Activity 状态。使用prstat时,它始终是“ sleep ”的。
奇怪的是,在一个Solaris框中,应用B不断消耗内存,而应用A正在处理请求。在应用B的线程转储中,我可以看到31个GC任务线程。
在另一个Solaris框中,应用B是正常的,内存是正常的,并且只有2个GC任务线程。
非常感谢。
最佳答案
GC任务线程与并行垃圾收集器的行为有关。
并行GC线程数的值由
-XX:ParallelGCThreads=n
命令行参数。在Java热点VM的文档中,它说:-XX:ParallelGCThreads=n
Sets the number of threads used during parallel phases of the garbage collectors. The default value varies with the platform on which the JVM is running.
(请参阅:http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html)
该文档没有明确说明,但是默认值随平台具有的处理器/内核数而变化,我认为该数目等于CPU内核数。
到目前为止,这就是“为什么JVM创建那么多GC任务线程的答案”。
这会引起任何内存问题吗?答案是不。实际上,每个GC线程的内存占用都非常低,因此,预计它们不会引起任何重大的内存问题。但是,您可能希望通过使用上述参数来微调垃圾回收线程的数量。
关于multithreading - 为什么应用程序会在一个Solaris框中创建31个 “GC task thread”而在另一个Solaris框中仅创建2个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8002007/