为什么在设置不同的 JVM XMX 时,相同代码的 RES 内存会发生变化
why the RES memory is changed for same code when different JVM XMX be setted
我使用 datastax 驱动程序创建与 Cassandra 的 NIO 连接,没有做任何其他事情,只是保持连接。
更重要的是,
当我设置XMX为1G时,RES(from top -p [java pid])会占用大约400M内存,
但是当我把XMX设置为512M时,RES只会占用200M左右的内存,
怎么理解呢?依我看来,我的代码做同样的事情,为什么占用不同的内存?
Cluster build = Cluster.builder().addContactPoint("10.224.57.163").withAuthProvider(new PlainTextAuthProvider("fujian","pass")).withLoadBalancingPolicy(new DCAwareRoundRobinPolicy("DC1")).build();
Session connect = build.connect("demo");
有两个因素在起作用
- java 不会急切释放托管堆内存。如果你给它更多的空间,它可能会减少 运行 GC 的使用频率(节省 CPU 周期)
- NIO 可能正在使用堆外内存 (
DirectByteBuffer
),直到持有内存的缓冲区被 GC 处理后才会释放。因此 GC 运行 不那么频繁可能不仅会占用更多的托管堆,而且会在以后释放堆外内存,从而产生额外的垃圾。
您可以尝试-XX:MaxHeapFreeRatio=30 -XX:MinHeapFreeRatio=20
将实际堆大小限制为更接近实际占用,即更快释放内存。
我使用 datastax 驱动程序创建与 Cassandra 的 NIO 连接,没有做任何其他事情,只是保持连接。
更重要的是, 当我设置XMX为1G时,RES(from top -p [java pid])会占用大约400M内存, 但是当我把XMX设置为512M时,RES只会占用200M左右的内存,
怎么理解呢?依我看来,我的代码做同样的事情,为什么占用不同的内存?
Cluster build = Cluster.builder().addContactPoint("10.224.57.163").withAuthProvider(new PlainTextAuthProvider("fujian","pass")).withLoadBalancingPolicy(new DCAwareRoundRobinPolicy("DC1")).build();
Session connect = build.connect("demo");
有两个因素在起作用
- java 不会急切释放托管堆内存。如果你给它更多的空间,它可能会减少 运行 GC 的使用频率(节省 CPU 周期)
- NIO 可能正在使用堆外内存 (
DirectByteBuffer
),直到持有内存的缓冲区被 GC 处理后才会释放。因此 GC 运行 不那么频繁可能不仅会占用更多的托管堆,而且会在以后释放堆外内存,从而产生额外的垃圾。
您可以尝试-XX:MaxHeapFreeRatio=30 -XX:MinHeapFreeRatio=20
将实际堆大小限制为更接近实际占用,即更快释放内存。