java 堆内存使用情况,与堆使用情况相比,Java应用程序的系统内存使用量巨大

I have a microservice like java framework. Many java processes run on a single box (ubuntu 14.04.4 LTS). The java processes use alot system memory, so the swap space is used heavily. The jstat gc reports do not explain the systems memory usage. All java processes run with the parameters

-XX:MinHeapFreeRatio=20 -XX:MaxHeapFreeRatio=40 -XX:GCTimeRatio=4 -XX:AdaptiveSizePolicyWeight=90

to force the JVM to give memory back to the system. Without the parameters the problem persists. Some java components use nashorn engine to script some functionality.

Can someone explain the behavior here?

Are there any jvm patameters that restrict the huge system memory usage?

How to command the OS to be more restrictive with memory allocation for the jvm?

Some data:

Component A (with nashorn)

top:

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND

2400 xxxxxx 20 0 13.933g 807496 7332 S 0.0 2.5 4180:15 java

jstat -gc 2400:

S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT

512.0 512.0 0.0 400.0 19456.0 12751.6 62464.0 59862.3 89688.0 84866.6 10624.0 9440.4 2165265 15977.896 16816 1813.836 17791.732

capacity: ca. 180 MB

usage: ca. 165 MB

system resources: ca. 800 MB

Why does the component uses more the 4 times the GC areas memory?

Component B (without nashorn)

top:

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND

19476 xxxx 20 0 13.465g 120436 7836 S 7.0 0.4 22:40.76 java

jstat -gc 19476:

S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT

512.0 512.0 0.0 0.0 41472.0 25408.7 343040.0 7164.5 17664.0 17183.1 2048.0 1919.4 3650 10.806 939 16.788 27.594

capacity: ca. 403 MB

usage: ca. 52 MB

system resources: 120 MB

Here the GC area capacities are bigger than the actual systems memory usage. Still the systems memory usage is twice the GC areas. IMO this component behaves normal because the libraries etc. are mapped partially into memory as well.

Component C (without nashorn)

top:

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND

2272 xxxxxx 20 0 13.382g 922944 11108 S 0.7 2.8 40033:41 java

jstat -gc 2272:

S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT

1024.0 1024.0 868.0 0.0 36352.0 23866.1 76800.0 56580.2 68864.0 64571.1 8448.0 7460.6 31974159 199295.501 844692 134644.040 333939.541

capacity: ca. 190 MB

usage: ca. 152 MB

system resources: 920 MB

Why does the component uses more the 6 times the GC areas memory?

解决方案

Can someone explain the behavior here?

There is no single explanation for memory usage, there are many contributing factors.

Use NMT to get an overview of how much memory is allocated by various internal parts of the JVM

use pmap -x to identify memory-mapped files.

take a heap dump to look for direct memory buffers (they just show up as some of the [anon] mappings in pmap) or use Yourkit which has a memory inspection to identify the amount allocated by direct buffers. At runtime you can use BufferPoolMXBean to track direct buffer use.

Beyond that, you have to take into account that each JVM comes with some baseline memory consumption and needed breathing room for the garbage collector. Running multiple services in a shared JVM can amortize those baseline costs.

Due to complexities of the virtual memory system you also need to be aware of the difference between used, committed, reserved and resident memory.

Are there any jvm patameters that restrict the huge system memory usage?

That would depend on the cause.

For the managed heap it's possible to make it yield unused memory back to the OS more swiftly, but comes with a performance penalty.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值