我是一名熟悉Unix内部的工程师,但不熟悉Java:(
我在Linux上管理服务器Java应用程序,并且最近发现它非常频繁(即每分钟几次)。
我的发现是:
所以我的问题是,这是java实现的首选行为吗?
我的理解是,分支一个巨大的进程应该是系统的重负荷,类似的事情可以在Java线程中完成,系统负载更轻。
谢谢和问候, 蹬抛
PS。 对不起,我无法访问Java应用程序的源代码。
答案 0 :(得分:1)
实际上,您所看到的是调用ls
的Java程序。 Fork + exec是程序调用另一个命令时您将看到的标准系统调用集。
幸运的是,分叉很便宜。 Linux在创建子项时不会复制程序的所有内存。相反,它采用写时复制在两个进程之间共享内存。只有当任何一个进程发生变化时,内存才会被重复。
Java程序使用Java API获取文件列表而不是调用外部命令会更聪明。调用ls
有点懒惰。不过,你应该关注自己。作为管理员,不要担心。
答案 1 :(得分:0)
这是Java实现的首选行为吗?
根本不是'Java实现的行为'。这是Java 应用程序所做的疯狂。显然他们没有听说过File.list()
及其各种朋友,或者更好的是java.nio.file.WatchService
。