2015-06-01 2 views
1

Я использую драйвер datastax для создания NIO-соединений с Cassandra без каких-либо других вещей, но просто поддерживаю соединение.Почему память RES изменяется для одного и того же кода при установке другого JVM XMX

Более того, когда я установил XMX в 1G, то RES (от верхней -p [Java PID]) будет занято около 400M памяти, но когда я поставил XMX к 512M, ВИЭ будут заняты только 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"); 

ответ

0

Есть два фактора в игре

  1. Java не освобождает управляемой памяти кучи с нетерпением. Если вы дадите ему больше места, он может использовать это, чтобы меньше работать с GC (экономит циклы процессора)
  2. NIO может использовать память с вылетом (DirectByteBuffer), которая не выводится до тех пор, пока буфер, удерживающий память, не будет GCed. Таким образом, GC, работающие реже, могут не только занимать больше управляемой кучи, но и позже освобождать память кучи и, следовательно, подвергать дополнительный мусор.

Вы можете попробовать -XX:MaxHeapFreeRatio=30 -XX:MinHeapFreeRatio=20, чтобы ограничить фактический размер кучи ближе к фактическому заполнению, то есть освободить память раньше.

Смежные вопросы