我只是在16核CPU上使用一个简单的独立java程序测试一些JNI调用。我正在使用64位JVM&操作系统是Linux AS5。但是,一旦我用64位c ++库启动我的测试程序,我就会看到'SIZE'列显示16G。 top命令输出如下:
PID PSID USERNAME THR PRI NICE SIZE RES STATE TIME CPU COMMAND 3505 31483 xxxxxxx 23 16 0 16G 215M sleep 0:02 0.00% java
我知道我的堆是可以的,但JNI内存可以增加进程大小,但我很困惑为什么它从16G-SIZE开始,我认为是虚拟内存大小?它真的占用了那么多记忆吗?我应该关注它吗?
答案 0 :(得分:0)
奇怪,但可能是你的JNI调用要么以某种方式迅速泄漏内存或分配大量内存。您使用什么命令行来启动JVM,以及您的JNI代码在做什么?
答案 1 :(得分:0)
Greg Hewgill的评论基本上说明了一切:你只使用了215 MB的实内存。在我的机器上,没有任何VM参数的无任何Java进程获得8 GB。你有四倍的内核,所以从内存的两倍开始对我来说是有意义的。
由于此数字只使用虚拟地址空间,例如2 * 48 B或2 * 64 B,它实际上是免费的。您可以使用-mx1G
将内存限制为1 GB,但请注意,这是一个硬限制,当进程需要更多时,您将获得OOME。