我遇到了一种特殊情况,我编写的 Java 应用程序在分叉并创建一些子进程时出现阻塞。根据错误日志,我看到有一种java.lang.UNIXProcess
方法在系统的交换空间中为 JVM 之外的父进程和子进程分配空间。抛出错误是因为没有足够的交换空间来同时容纳父进程和子进程。
系统正在大发雷霆,不想在没有充分理由的情况下增加交换空间,所以我想看看是否有任何恶意进程在发生此分叉的同时占用了可用的交换空间。如果我能证明需要增加交换空间来处理我的父/子进程以及系统需要运行的其他任务(例如安全扫描等),那么我就可以让我的票获得批准并回家。
超级用户会做什么?
编辑:我应该指出这些错误是仅有的发生在我们共享的 QA 机器上,该机器上运行着许多其他项目/应用程序。在我们独立的开发机器上,这非常有效,从硬件/虚拟内存/磁盘的角度来看,开发机器是 QA 的镜像。因此,如果通过了开发并在 QA 上失败,这强烈表明我的应用程序只是在争夺交换空间,而由于其他人正在使用它,所以无法使用交换空间。
答案1
在 Solaris 中,进程正在使用或请求的虚拟内存的后备存储是物理 RAM 还是交换空间并不重要。您需要查看系统范围内正在使用的内存量,而不是当时实际调出的内存量。这包括 /tmp 文件系统。
注意:默认情况下,Solaris 对 /tmp 使用基于内存的文件系统。/tmp 中的文件和目录结构使用系统池中的虚拟内存。/tmp 中的可用空间由系统范围内可用的虚拟内存量决定。
在 Solaris 9 及更高版本中,使用prstat -c -s size -n <# of processes to show> 0 1
获取所有正在运行的进程的列表,按每个进程使用的虚拟内存量降序排列。请参阅“SIZE”列以了解每个进程使用的总虚拟内存。