背景:
我们有一个供应商提供的 Java 应用程序,它有一个较大的 Java 堆。无需过多介绍信息,该应用程序对我们来说就是一个黑匣子,但我们觉得我们需要自己尝试调整性能并解决问题。
64 位 SunOS 10 机器有 16GB 内存,唯一运行的非系统应用程序是该应用程序的 JVM。64 位 JVM 在 JBoss 中运行,我认为这与本次讨论无关,最大堆大小为 8GB,我认为这是相关的。
最近的问题是我们遇到了各种内存不足的错误。当这些错误发生并且错误询问“Out of Swap Space?”时,堆未满。供应商希望我们将交换空间从 2GB 增加到 4GB,这是在一个 16GB 的系统上,而应用程序只有 8GB。我们认为这对性能来说是个坏主意。
我的问题:
所以我们发现的一件事是文件缓存用尽了所有剩余的可用内存来提高性能。通常不是问题,但它显然会使内存碎片化。由于 Hotspot JVM 需要连续的内存空间,我们了解到这种内存碎片会导致使用未碎片化的交换空间。
但是,我不确定我是否理解碎片和连续内存要求之间的关系。当然,碎片只是指物理内存的碎片。使用虚拟内存,完全有可能分配一个连续的 ram 块,而不需要一个连续的 ram 块支持。换句话说,一块不连续的物理内存对于正在运行的进程来说就像一块连续的虚拟内存。
所以,我想,那里没有一个句子问题,但是有没有人对这个主题了解更多并且可以插话?在 64 位系统上引用此连续内存问题的任何链接?
到目前为止我发现了什么:
到目前为止,我发现的所有关于“连续内存”问题的参考都与 32 位地址系统中虚拟地址空间的布局方式有关。由于我们运行的是 64 位系统(我认为是 48 位寻址),因此有大量虚拟地址空间来分配大的连续块。
我一直在互联网上寻找这些信息,但到目前为止,我一直无法找到我正在寻找的信息。
更新:
- 需要明确的是,我并没有试图回答为什么会出现 OOM 错误,而是试图了解可能碎片化的系统 RAM 与 java 所需的连续虚拟内存块之间的关系。
- prstat -Z
ZONEID NPROC SWAP RSS MEMORY TIME CPU ZONE
0 75 4270M 3855M 24% 92:24:03 0.3% global
- 回声“::memstat”| mdb -k
Page Summary Pages MB %Tot
------------ ---------------- ---------------- ----
Kernel 326177 2548 16%
ZFS File Data 980558 7660 48%
Anon 561287 4385 27%
Exec and libs 12196 95 1%
Page cache 17849 139 1%
Free (cachelist) 4023 31 0%
Free (freelist) 156064 1219 8%
Total 2058154 16079
Physical 2042090 15953
我以前认为 ZFS 文件数据是可以免费使用的内存,但后来我了解到情况并非如此,很可能是错误的原因。
vmstat 5 5
kthr memory page disk faults cpu
r b w swap free re mf pi po fr de sr vc vc vc -- in sy cs us sy id
0 0 0 2161320 2831768 12 55 0 0 0 0 0 3 4 -0 0 1089 1320 1048 1 1 98
0 0 0 819720 1505856 0 14 0 0 0 0 0 4 0 0 0 1189 748 1307 1 0 99
0 0 0 819456 1505648 0 1 0 0 0 0 0 0 0 0 0 1024 729 1108 0 0 99
0 0 0 819456 1505648 0 1 0 0 0 0 0 0 0 0 0 879 648 899 0 0 99
0 0 0 819416 1505608 0 1 0 0 0 0 0 0 3 0 0 1000 688 1055 0 0 99
这些命令输出是在应用程序以健康状态运行时获取的。我们现在正在监视以上所有内容并记录它,以防我们再次看到交换空间错误。
以下是 JVM 增长到 8GB 然后重新启动后的情况。这样做的效果是 ZFS ARC 已经缩小(到 26% RAM),直到它再次增长。现在情况如何?
vmstat 5 5
kthr memory page disk faults cpu
r b w swap free re mf pi po fr de sr vc vc -- -- in sy cs us sy id
0 0 0 1372568 2749528 11 41 0 0 0 0 0 2 3 0 0 713 418 539 0 0 99
0 0 0 3836576 4648888 140 228 0 0 0 0 0 0 0 0 0 1178 5344 1117 3 2 95
0 0 0 3840448 4653744 16 45 0 0 0 0 0 0 0 0 0 1070 1013 952 1 3 96
0 0 0 3839168 4652720 6 53 0 0 0 0 0 0 0 0 0 564 575 313 0 6 93
0 0 0 3840208 4653752 7 68 0 0 0 0 0 3 0 0 0 1284 1014 1264 1 1 98
- 交换-s
总计:分配的 4341344k 字节 + 保留的 675384k = 使用的 5016728k,可用的 3840880k