Heap Memory default allocation in Cassandra

孤人 提交于 2020-01-24 20:10:35

问题


As per cassandra-env.sh the default heap memory allocation for a 440G Total RAM should be 32765M (Maximum CAP before JVM Swithches to 64 bit reference).

So, why is it showing 32210157568 bytes(30718M) when I query "java -XX:+PrintCommandLineFlags -version" or "java -XX:+PrintFlagsFinal -version | grep -iE 'MaxHeapSize'"

Why is there difference, of around 2G.

FYI: jvm.options files was default & using DSE 5.1.3.


回答1:


java -XX:+PrintFlagsFinal has nothing to do with Cassandra, and I don't know why you mention cassandra-env.sh. Anyway, let me answer the main part of the question.

In JDK 8, when -Xmx is not specified, the maximum heap size is estimated as

MaxHeapSize = min(1/4 RAM, max_heap_for_compressed_oops)

In your case the server has plently of RAM, so the default heap size is limited by the maximum possible size supported by zero-based compressed oops, that is, 32 GB.

The heap obviously cannot start at zero address (null page is reserved by the OS), and the default heap alignment is 2 MB, so we must subtract at least 2 MB.

Then, JDK prefers to allocate the heap at HeapBaseMinAddress, which is equal to 2 GB on Linux. This provides some space to grow the native heap of the process. For this reason JVM reduces the default maximum heap size by HeapBaseMinAddress.

That's why the final computed heap size is equal to

32 GB - 2 MB - 2 GB = 32210157568

If you give up the requirement for the zero-based compressed oops, you may set -XX:HeapBaseMinAddress=0. In this case the computed heap size would be

32 GB - 2MB = 32766 MB


来源:https://stackoverflow.com/questions/57632486/heap-memory-default-allocation-in-cassandra

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!