JVM配置说明:
注:基于java应用的JVM配置
JVM:
备注:全局数据区,目的为了节省内存空间,避免所有new的对象中共同属性都开辟内存空间
因为堆和栈是动态分配内存空间的,所有配置JVM就是基于堆栈内存空间的分配。
配置JVM的位置:
Linux:在tomcat下的bin/catalina.sh文件中配置。
1、vim catalina.sh
2、在大致106行的位置添加如下内容:(因为106行左右都是配置信息,所有将配置信息同一放到该处)
"JAVA_OPTS"="-server -Xmx500m -Xms500m -Xmn200m -XX:MaxPermSize=256m -XX:PermSize=256m -XX:SurvivorRatio=6"
说明:
-Xmx500m 表示整个堆最大的内存 官方推荐是物理内存的1/4
-Xms500m 表示堆初始化的内存 官方推荐是物理内存的1/64
注:
1、堆内存分配时,根据启动服务器之后,系统剩余的内存来分配。(总内存 - 系统启动占用内存)
2、JVM内存是从物理内存借用的,tomcat启动成功,即表示JVM从物理内存分配也成功。
-Xmn200m 表示新生代内存 推荐分配整个堆的3/8
新生代分三个区:
eden区、s0交换区、s1交换区(这两个交换区总有一个是空的,采用的是复制算法)
即:-Xmn = eden + s0 + s1 (三个内存相加等于新生代的内存)
新生代三个区的内存分配:
通过-XX:SurvivorRatio参数来指定eden区和交换区的内存占比。
例如:-Xmn200m -XX:SurvivorRatio=6 那么eden区占新生代的内存的6份 即 120m ,交换区占新生代的内存的4份 即80m(分配到每个交换区就是s0 占40m,s1 占40m)
默认的eden区和交换区的占比为8,即-XX:SurvivorRatio=8
老年代的内存大小:
堆最大内存 - 新生代内存 = 老年代内存 (所有只需要配置新生代内存即可)
注:比较好的堆内存配置方式,将堆最大内存和初始化内存配置成一样的!
原因:
避免当超出初始化配置的内存后,向物理内存中申请内存。
当申请的时候:
1、物理内存此时不够,代码产生的数据不能存入到JVM,程序报错。
2、物理内存此时够,从申请内存,到拿到内存,然后将数据存储到JVM,都会有效率影响。
-XX:PermSize=256 表示栈初始化内存 官方推荐是物理内存的1/64
-XX:MaxPermSize=256 表示最大占内存 官方推荐是物理内存的1/4
注:比较好的栈内存配置方式,将栈最大内存和初始化内存配置成一样的!
原因:
避免当超出初始化配置的内存后,向物理内存中申请内存。
当申请的时候:
1、物理内存此时不够,对象引用就不能存放到栈中,程序报错。
2、物理内存此时够,从申请内存,到拿到内存,然后将引用存储到栈中,影响效率。
注:栈中一般存放的都是对象堆中的地址引用,所有占用内存相对比较小,所有节省内存的情况下,可以只给栈内存分配256m或者128m。
堆内存的分配情况查看:
1、通过上述方式配置JVM。
2、启动tomcat。
3、通过jps 或者ps -ef | grep java 获取java进程的id ---->pid
4、通过jmap -heap pid 查看堆内存分配情况,如图:
JVM参数说明:
并发收集器相关参数:
CMS相关参数:
辅助参数: