服务器java应用程序经常分叉

时间:2018-02-12 00:48:54

标签: java linux fork

我是一名熟悉Unix内部的工程师,但不熟悉Java:(

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

我的发现是:

  1. 由于java进程占用了> 20GB的内存,因此分叉占用了另外20GB
  2. fork完成后,子进程快速退出
  3. 子进程的argv [0]是' [ls]',这可能意味着父进程调用/ bin / ls
  4. 所以我的问题是,这是java实现的首选行为吗?

    我的理解是,分支一个巨大的进程应该是系统的重负荷,类似的事情可以在Java线程中完成,系统负载更轻。

    谢谢和问候, 蹬抛

    PS。 对不起,我无法访问Java应用程序的源代码。

2 个答案:

答案 0 :(得分:1)

实际上,您所看到的是调用ls的Java程序。 Fork + exec是程序调用另一个命令时您将看到的标准系统调用集。

幸运的是,分叉很便宜。 Linux在创建子项时不会复制程序的所有内存。相反,它采用写时复制在两个进程之间共享内存。只有当任何一个进程发生变化时,内存才会被重复。

Java程序使用Java API获取文件列表而不是调用外部命令会更聪明。调用ls有点懒惰。不过,你应该关注自己。作为管理员,不要担心。

答案 1 :(得分:0)

  

这是Java实现的首选行为吗?

根本不是'Java实现的行为'。这是Java 应用程序所做的疯狂。显然他们没有听说过File.list()及其各种朋友,或者更好的是java.nio.file.WatchService