我最近发现G1GC有一些奇怪的行为。我正在使用Java 1.8.0_152,并已将GC算法设置为具有字符串重复数据删除功能的G1GC。最近,我看到Java进程(从顶部-c获得)的内存占用为6.8g,而实际堆大小(S0U + S1U + EU + OU)为4 gb。有260个线程(使用默认的xss 1MB),我发现G1收集器本身占用了2.54gb的内存,这似乎很大。.我在这里丢失了什么吗?。有人可以在这里帮助我...关于G1GC本身为什么占用如此多的内存..如果我的堆增加到6 gb,将会发生什么... G1GC会尝试占用比现有RAM(8 gb)更多的内存并失败还是将执行完整的GC(我认为应该如此)时间
我的XMX是7GB
G1GC内部似乎正在占用额外的内存。我通过jstat运行了一个完整的GC,而Java进程占用量增加了0.1gb。这使我认为G1GC内部正在占用此内存。除了减少RAM之外,还有其他方法可以确保G1GC行程不会占用太多内存
答案 0 :(得分:0)
使用-Xmx=7G
,G1可能会占用7GB RAM用于Java对象堆 ,以及用于管理该堆的额外内存。此外,JVM(非G1)可能会占用不同数量的内存,用于内存映射文件,已加载的类数据,已编译的方法,直接字节缓冲区和其他内部数据。此外,加载到进程中的任何本机库也可能会占用任何特定于Java的机制无法跟踪的内存。
一旦物理内存耗尽,操作系统将如何处理取决于配置。它可能会交换到磁盘,尝试压缩内存或终止进程。 JVM在被杀死之前可能会检测到某些但不是全部情况,而是抛出OOME。