我是一名工程师,非常熟悉 Unix 内部结构,但不熟悉 Java :(
我在 Linux 上管理一个服务器 Java 应用程序,最近发现它 fork 非常频繁(即一分钟几次)。
我的发现是:
- 由于java进程占用>20GB内存,forking本身占用另外20GB
- fork完成后,子进程快速退出
- 子进程的argv[0]是'[ls]',这可能暗示父进程调用/bin/ls
所以我的问题是,这是 java 实现的首选行为吗?
我的理解是, fork 一个巨大的进程对系统来说应该是一个沉重的负载,而类似的事情可以在系统负载更轻的 Java 线程中完成。
感谢和问候, 踢球
附言。 抱歉,我无法访问 Java 应用程序的源代码。
最佳答案
确实,您看到的是调用 ls
的 Java 程序。 Fork+exec 是标准的系统调用集,您会在程序调用另一个命令时看到。
幸运的是, fork 很便宜。 Linux 在创建子进程时不会复制程序的所有内存。相反,它使用写时复制在两个进程之间共享内存。只有当任一进程更改某些内容时,内存才会真正复制。
对于 Java 程序来说,使用 Java API 获取文件列表而不是调用外部命令会更聪明。调用 ls
有点懒惰。不过,这不是您应该关心的事情。作为管理员,请不要担心。
关于java - 服务器 java 应用程序经常 fork ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48738106/