为什么在设置不同的JVM XMX时对相同的代码更改RES内存



我使用datastax驱动程序与Cassandra创建NIO连接,而不做任何其他事情,只是保持连接。

更重要的是,当我将XMX设置为1G时,RES(从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");

有两个因素在起作用

  1. java不主动释放托管堆内存。如果你给它更多的空间,它可能会用它来运行gc更少(节省CPU周期)
  2. NIO可能正在使用堆外内存(DirectByteBuffer),直到占用内存的缓冲区被GCed才释放。因此,运行频率较低的gc不仅会占用更多的托管堆,还会在稍后释放堆外内存,从而产生额外的垃圾。

您可以尝试-XX:MaxHeapFreeRatio=30 -XX:MinHeapFreeRatio=20将实际堆大小约束为更接近实际占用,即更快地释放内存。

最新更新