为啥Java会产生这么多进程?

Posted

技术标签:

【中文标题】为啥Java会产生这么多进程?【英文标题】:Why does Java spawn so many processes?为什么Java会产生这么多进程? 【发布时间】:2014-10-19 14:25:49 【问题描述】:

我编写了一个在 debian 7 虚拟服务器上运行的 Java 服务器应用程序。应用程序本身运行良好,但我注意到一些非常奇怪的事情。

调用java -Xmx200M -jar "CCU.jar 后,我希望看到一个Java 进程运行我的CCU.jar

当调用top 时,只有一个 java 进程(如预期的那样)。但是当我打电话给htop 时,我得到了这个:

所有这些看起来是同一个进程(它们具有表中显示的完全相同的数据)但具有不同 PID 的子进程是什么?

【问题讨论】:

【参考方案1】:

Java 应用程序永远不是单线程的(垃圾收集器线程等等)。所以你总是以几个线程结束。此外,Linux 将线程实现为Light-weight process,因此,每个Java 线程将在htop 中显示为具有唯一PID 的进程。

【讨论】:

好的。感谢您的回答。如果我的应用程序由 3 个没有客户端连接的线程(与主线程)组成,那么这么多线程会不会很奇怪? 是的,好像有点高。你在使用 GUI 吗? 没有。它是主线程和一个接受传入 TCP 连接的线程。但我将 JDBC 与 BoneCP 连接池一起使用。这可能就是所有线程的来源。 所以有主线程、客户端acceptor线程和至少6个连接池线程。 JDBC 也使用 Log4J,它可能会产生线程。线数还奇怪吗? 不,现在看起来很正常;)【参考方案2】:

即使是最简单的 Java 应用程序也会使用多个线程来处理代码之外的事情。例如垃圾收集器、终结器线程等等。

这么多线程表明您的应用程序中发生了一些多线程,因为 Java 不会为自己生成那么多线程。

【讨论】:

以上是关于为啥Java会产生这么多进程?的主要内容,如果未能解决你的问题,请参考以下文章

Python 多处理 - 为啥每个进程有这么多线程?

为啥新的 ElasticSearch 安装运行这么多进程?

为啥有这么多 apache 进程在运行?

为啥 htop 列出了这么多 mysql 连接?

为啥python线程会消耗这么多内存?

多进程读写资料的效率为啥会远远不如一个进程直接io的效率