如何使用JConsole配置交换空间

时间:2012-06-14 15:05:45

标签: java memory-management solaris swap

我在远程Solaris计算机上部署了一个Java Web应用程序(WAR),该计算机正在抛出声称“空间不足”的IOExceptions。在花了好几天痛苦地研究这个问题后,我发现我的代码中有一些进程需要Solaris将父/子进程放在系统交换空间中,并且每次都没有足够的交换空间来包含两个进程。 Here是一篇文章,比我能更有说服力/更聪明地解释发生的事情。但它绝对是罪魁祸首。

因此,我需要使用我们的系统管理员添加一张票以增加交换空间,但我一直试图弄清楚我需要多少空间。我可以使用JConsole来分析服务器上的内存使用情况,但是在VM Summary选项卡上,交换空间使用/可用信息似乎只在JConsole启动时才会被读取并且不会刷新。这使我无法在重现此分叉/内存问题时使用JConsole查看实时交换使用情况。

我有权访问的唯一服务器监视器是prstat(我习惯topnmon)。

我需要给系统一个特定的号码(即请将myserver.net的交换空间增加250M 等)。 如何获取此数字?服务器在Java 1.6u25上运行,因此可能有一些我不知道的Java工具,或者我可能使用的某些Solaris分析器/监视器。

2 个答案:

答案 0 :(得分:1)

通常,您将使交换空间至少与主内存大小一样大。因此,一台16 GB的机器可能有16 GB的交换空间。 (以前交换是主内存大小的很多倍)

对于Java,除了“堆外”内存外,它都必须在物理内存中。这是因为如果您执行GC,例如,它将检查所有内存,如果甚至其中一些已被交换,您的应用程序将一次挂起几秒钟或几分钟。

如果您的应用程序似乎需要更多的交换空间,那么您真正需要的内容很可能是更多主内存。

答案 1 :(得分:0)

如果您提供更多信息,例如当前RAM和交换大小,运行的JVM数量,堆大小和虚拟内存使用情况以及这些分叉过程的预期并发级别,将会有所帮助。 prstat -Z输出也会有所帮助。

在任何情况下,您都可以使用swap -s命令监视虚拟内存使用情况,并确保最后一个值(... k可用)总是足够大。

请注意,尽管有一个共同的信念,但是交换太大没有任何问题所以我建议只是将当前的交换区域大小加倍作为第一种方法。

您使用swap -l命令获得了当前的交换区域大小。

Here是一篇关于Solaris应用程序内存管理的文章,可能也有帮助。