multithreading - 为什么应用程序会在一个Solaris框中创建31个 “GC task thread”而在另一个Solaris框中仅创建2个

标签 multithreading memory garbage-collection jvm solaris

我在一个应用程序(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/

相关文章:

c# - 有没有办法返回所有未引用的对象?

java - 创建数百万个小型临时对象的最佳实践

.net - 做跨线程 Winforms 的最简单方法是什么?

c++ - epoll 或 kqueue 是否可以处理向自身异步添加文件描述符

Android:你如何获得内部总内存/可用内存?

java - Soft Reference中GC在java中的作用

Java : Running shell script in background

使等待线程返回用户空间

c++ - 如何找到特定地址范围内的空闲内存

c++ - 如何确定某些东西在分层结构的内存中的存储位置