1. Java内存设置推荐参数
- 堆内存参数:
- -Xmx512m: 最大总堆内存,推荐设置为物理内存的1/4
- -Xms512m: 初始总堆内存,推荐和最大堆内存一样大(GC之后就不必调整堆内存大小)
- -Xmn192m: 年轻代堆内存,官方推荐为整个堆的3/8
- 永久代参数
- -XX:PermSize=128m 堆的初始大小,一般设置为128m即可,原则为预留30%的空间
- XX:MaxPermSize=128m:堆的最大大小,一般设置为128m即可,原则为预留30%的空间
2. 查看内存使用
- 查看JVM 的配置
java -XX:+PrintFlagsFinal -version | grep -iE 'HeapSize|PermSize|ThreadStackSize'
- 查看程序内存占用
// 可以直接看到内存及cpu占用
top
// 查看某一具体进程程序
top -p pid
// 查看内存占用
ps -aux|grep xxx
// 会打印当前进程详细情况,内存是VmRSS
cat /proc/pid/status
3. 设置Java 内存限制方法
- 直接通过java 命令去执行class文件的时候设置JVM参数
java -Xms512m -Xmx512m helloword
- eclipse可以在eclipse.ini 配置文件中设置,也可以在eclipse执行一个java类时,通过右键的参数添加部分去设置
- 一般的像tomcat,weblogic这些web容器,都是应用jvm启动的,所以在他们的启动脚本中都会去调用JVM,就可以在他们的启动脚本中设置堆栈的大小
- springboot 项目设置内存限制
// 设置启动参数
java -Xms1g -Xmx2g -jar xxx.jar
- 启动jvm 手动设置内存
// 每次jvm进行垃圾回收时显示内存信息,jvm的堆内存设为固定20M
java -verbose:gc -Xms20M -Xmx20M
- 修改系统环境变量,设置JVM的JAVA_TOOL_OPTIONS
vi ~/.bashrc
export JAVA_TOOL_OPTIONS='-Xms30g -XMx30g'
source ~/.bashrc
注意:
- 设置内存限制最好检查一下物理内存是否充足
- 另外注意一台机器上多个jar应用,建议分别各个程序的内存限制
- 设置内存限制防止程序超过系统物理最大限制内存,从而被系统杀掉
- 限定的内存不能低于程序正常需要,当程序QPS大、耗内存任务比较多,内存限制不用设置过小
- 当程序运行时候超过程序的设置的内存限制,会不断的gc,如果还不够,会让该线程直接OOM,从而释放内存,然后如果此线程还不能回收,java会不断的启动gc线程回收内存,最后CPU飚满,java应用没响应
- -Xmx设置的是总堆内存限制,但是JVM运行过程中到底会向操作系统申请多少内存,这个是由JVM在运行过程中动态决定的,我们无法设置,比如JVM本身对堆内存管理,垃圾回收,动态库加载等等都不在堆内存限制范围内