0

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

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

我可以访问的唯一服务器监视器是一个叫做prstat(我习惯topnmon)的东西。

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

4

2 回答 2

1

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

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

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

于 2012-06-14T15:17:18.420 回答
0

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

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

请注意,尽管人们普遍认为,交换太大完全没有问题,因此我建议您将当前交换区域大小简单地增加一倍作为第一种方法。

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

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

于 2012-06-15T00:30:01.297 回答