在Java 8上的Linux中,实际内存使用量大于Xmx + MaxDirectMemorySize + MaxMetaspaceSize +(n * Xss)

时间:2019-01-14 04:28:42

标签: java-8 garbage-collection jvm spring-cloud netflix-zuul

我正在使用Spring Cloud Zuul设置HTTP网关服务。该代码确实可以正常运行,但是我想进行一些内存优化。

这是我的启动命令:

java -XX:NativeMemoryTracking=detail -XX:MaxDirectMemorySize=64m -XX:-UseCompressedClassPointers -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m -Xms256m -Xmx256m -Xmn64m -Xss256k -XX:SurvivorRatio=8 -XX:+UseConcMarkSweepGC -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -XX:+PrintGCApplicationStoppedTime -XX:+PrintGCApplicationConcurrentTime -XX:+PrintHeapAtGC -Xloggc:gateway_gc.log -jar gateway-service.jar --spring.config.location=bootstrap.yml

我希望网关进程分配的总内存为64m + 128m + 256m + (256k * num_of_threads),大约为540MB。但是当我使用top进行检查时,网关进程分配了983444 RES(960MB)。

超出了我的预期400MB。

然后我使用jcmd VM.native_memory检查了网关进程,该进程显示jvm提交的内存为789720KB(771MB),仍然小于960MB。

我还检查了/proc/<pid>smaps文件,并将该文件中的所有Rss字段加起来,结果就是960MB。但是我无法理解文件中显示的映射。

So, 1. How can I check the exactly memory usage of JVM? 2. Is there any way I can restrict the JVM memory allocation via JVM arguments?

-我正在使用HotSpot Java版本“ 1.8.0_181”。

0 个答案:

没有答案