@
ZZ74 @
silencegg 请问是通过什么判断的堆外内存不够的? >99% committed ?`mmap`?
@
zhouhu 非常感谢,解释得很详细了,但自己太菜了术语太多有点看不懂,想确认一下:
> 此时 cs eden 区: 122 ,survivor cs: 18 ,JVM 完全可以进行垃圾收集。
> 从统计 E|cs: 122 + s|cs: 18 = 140 来说,当内存不足时,JVM 完全时可以进行 GC 的
也就是说,还存在 Young Generation 的话,就意味着还有可以 GC 的空间,而不需要申请新的内存,但因为还没达到 `-Xms` 设置的上限,所以为了性能 JVM 没选择 GC ,而是直接继续申请分配内存了,是这样理解吗?
另外注意到
```
MaxMetaspaceSize: unlimited
CompressedClassSpaceSize: 1.00 GB
Initial GC threshold: 20.80 MB
Current GC threshold: 136.30 MB
```
单 `CompressedClassSpaceSize` 就有 1G ,加上 `-Xmx2847m`,剩下的内存肯定不够给其他进程分配的,但因为未设置 `-Xms`,所以最开始 JVM 给 Heap 申请的大小没那么多,但随着程序运行,JVM 想要申请更多内存时,算上已经被用掉的堆外内存及其他进程占用的内存后,剩余可用内存不够分配,所以导致 JVM 发生 OOM (但其实),是这样吗?
把 JVM 参数设为
```
-Xms2560m -Xmx2560m -XX:MaxMetaspaceSize=256m -XX:ReservedCodeCacheSize=240m
```
是否可行?