java - 服务器 java 应用程序经常 fork

标签 java linux fork

我是一名工程师,非常熟悉 Unix 内部结构,但不熟悉 Java :(

我在 Linux 上管理一个服务器 Java 应用程序,最近发现它 fork 非常频繁(即一分钟几次)。

我的发现是:

  1. 由于java进程占用>20GB内存,forking本身占用另外20GB
  2. fork完成后,子进程快速退出
  3. 子进程的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/

相关文章:

java - CKEDITOR,在jsp页面上传图片

linux - 如何使保存的文件无处可去?

java - 如何组合来自同一个字符数组的 2 个值?

java - 找不到虚拟机错误 : Eclipse

linux - Linux的选择

mysql - 在 WINDOWS、Linux、macOS 上自动安装 MySQL

c - 为什么此代码片段的输出有所不同?

python - python 中的 fork 服务器

c++ - Boost.Log 和创建守护进程; `fork` 不允许?

java - 尝试执行 restclient 请求时找不到合适的 HttpMessageConverter