首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >限制Java 8内存消耗

限制Java 8内存消耗
EN

Stack Overflow用户
提问于 2017-12-13 12:30:11
回答 1查看 3.9K关注 0票数 3

我在64位Ubuntu上运行了三个Java 8 JVM,它是从最小安装构建的,除了三个JVM之外,没有任何额外的运行。VM本身有2GB的内存,每个JVM都受到-Xmx512M的限制,我认为这是很好的,因为有几百MB的空闲空间。

几周前,一架飞机坠毁,hs_err_pid垃圾场显示:

代码语言:javascript
复制
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (mmap) failed to map 196608 bytes for committing reserved memory.
# Possible reasons:
#   The system is out of physical RAM or swap space
#   In 32 bit mode, the process size limit was hit
# Possible solutions:
#   Reduce memory load on the system
#   Increase physical memory or swap space
#   Check if swap backing store is full
#   Use 64 bit Java on a 64 bit OS
#   Decrease Java heap size (-Xmx/-Xms)
#   Decrease number of Java threads
#   Decrease Java thread stack sizes (-Xss)
#   Set larger code cache with -XX:ReservedCodeCacheSize=
# This output file may be truncated or incomplete.

我以384 so的压缩堆大小重新启动JVM,到目前为止一切都很好。但是,当我当前使用ps命令查看VM时,我看到

代码语言:javascript
复制
RSS %MEM    VSZ   PID CMD
708768 35.4 2536124 29568 java -Xms64m -Xmx512m ...
542776 27.1 2340996 12934 java -Xms64m -Xmx384m ...
387336 19.3 2542336 6788 java -Xms64m -Xmx512m ...
12128  0.6 288120  1239 /usr/lib/snapd/snapd
 4564  0.2  21476 27132 -bash
 3524  0.1   5724  1235 /sbin/iscsid
 3184  0.1  37928     1 /sbin/init
 3032  0.1  27772 28829 ps ax -o rss,pmem,vsz,pid,cmd --sort -rss
 3020  0.1 652988  1308 /usr/bin/lxcfs /var/lib/lxcfs/
 2936  0.1 274596  1237 /usr/lib/accountsservice/accounts-daemon
..
..

自由命令显示

代码语言:javascript
复制
              total        used        free      shared  buff/cache   available
Mem:           1952        1657          80          20         213          41
Swap:             0           0           0

以第一个进程为例,RSS大小为708768 KB,尽管堆限制为524288 KB (512*1024)。

我知道JVM堆上使用了额外的内存,但问题是如何控制它以确保不会再次耗尽内存?我试图尽可能地为每个JVM设置堆大小,而不会使它们崩溃。

或者,对于如何根据总体内存可用性来设置JVM堆大小,是否有一个很好的通用指导方针?

EN

回答 1

Stack Overflow用户

发布于 2017-12-20 12:03:22

似乎没有控制JVM在堆上使用多少额外内存的方法。然而,通过对申请进行一段时间的监测,可以得到对这一数额的良好估计。如果java进程的总体消耗高于预期,则可以减少堆的大小。需要进一步监测,以确定这是否会影响性能。

继续上面的示例,并使用命令ps ax -o rss、pmem、vsz、pid、cmd排序-rss,我们看到今天使用的是

代码语言:javascript
复制
  RSS %MEM    VSZ   PID CMD
704144 35.2 2536124 29568 java -Xms64m -Xmx512m ...
429504 21.4 2340996 12934 java -Xms64m -Xmx384m ...
367732 18.3 2542336 6788 java -Xms64m -Xmx512m ... 
13872  0.6 288120  1239 /usr/lib/snapd/snapd
..
..

这些java进程都在运行相同的应用程序,但数据集不同。第一过程(29568)使用超过堆极限的大约190米保持稳定,而第二过程(12934)已从156米减少到35米。第三个内存的总使用量保持在堆大小以下,这表明堆限制可以减少。

在这里,似乎每个java进程允许200 It额外的非堆内存就足够了,因为这给了600 It的回旋余地。从2GB中减去这个值将留下1400 be,因此三个-Xmx参数值的总和应该小于这个值。

正如阅读这篇文章时收集到的,Fairoz在评论中指出,JVM可以使用许多不同的方式使用非堆内存。其中一个是可测量的线程堆栈大小。使用java -XX:+PrintFlagsFinal -version grep ThreadStackSize在linux上可以找到JVM的默认值--在上面的情况下是1MB,而且由于大约有25个线程,我们可以放心地说,至少需要额外的25 1MB。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47793089

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档