怎么去配置一个新生代和一个老年代的一个比例,新生代的比列和老年代的比例怎么配,基本原则是遵循什么原则,遵循1:2,
为什么要遵循1:2,1:2是大致的,你们也不能说完全是1:2,这个你们要看什么公司,什么项目,你们可以把老年代设大一点,
新生代设小一点,基本原则是让新生代设置尽量小一点,让垃圾回收在新生代回收多一点,老年代因为比例比较大,空间比较足,
他的回收次数会稍微少一点,使用示例: -Xms20m -Xmx20m -XX:SurvivorRatio=2 -XX:+PrintGCDetails -XX:+UseSerialGC
-XX:NewRatio=2,说明:堆内存初始化值20m,堆内存最大值20m,新生代最大值可用1m,eden空间和from/to空间的比例为2/1
新生代和老年代的占比为1/2,这个其实已经有个说明了,堆内存的初始值是20M,堆内存的最大值也是20M,-XX:SurvivorRatio=2
这个参数我就不说了,刚才已经讲过了,新生代的eden区和from/to的比例是1:2的关系,-XX:NewRatio=2这个是新生代和老年代
的比例是1:2,我们之前的是多少G的吗,8G内存的,现在服务器标配是8G,也有32G的,那说明是很有钱了,有一台32G的服务那就很好了
那非常非常贵的,基本上都是好几万的,我是按照8G的内存来配,这个时候一比二的时候怎么办呢
package com.learn.test;
/**
* 配置新生代和老年代
* 一般很少用4G服务器的
* 基本上服务器标配都是8G的
* 我之前的项目都是8G内存
* 很少有4G内存的
* Redis有的人去买阿里云的缓存
* 这样运维就不用管了
* 这个看场景
* -XX:NewRatio=2这个参数表示一比二的关系
* -Xms20m -Xmx20m -XX:SurvivorRatio=2 -XX:+PrintGCDetails -XX:+UseSerialGC -XX:NewRatio=2
* 这个参数配置一下然后运行一遍
* [GC (Allocation Failure) [DefNew: 3261K->1664K(5120K)
* 这个时候你会发现怎么回收次数怎么这么多
* 回收了3次
* 你们把参数给看一下
* 这次GC回收回收了3次
* 新生代与老年代占比 1/2 13696K
* 这个时候大家可以算笔账
* 老年代现在是13696K
* eden space 3456K,from space 1664K,to space 1664K,把这个总和乘以2
* 如果大致等于13696K那说明是对的
* 是不是大致等于这个数了
* 13568是不是快接近13696K
* 我们来看一下默认的新生代和老年代的占比关系
* -XX:+PrintGCDetails -XX:+UseSerialGC
* 我们去掉一些参数,然后运行如上参数
* 你们知道现在的新生代和老年代的占比是多少吗
* 这个时候我们可以把这个计算一下
* eden space 34944K,from space 4352K,to space 4352K,
* the space 87424K,
* 34944K+4352K+4352K=43648K
* 87424K/43648K=2
* 1:2,新生代占1/3,老年代占2/3
* 不同的JVM其实是有很大的差别的
* 6之前到现在其实是有非常大的变化的
* 垃圾收集器开始的时候只有串行和并行
* 现在都是G1和CMS收集器
* 技术总监一般不会做这个事情的,
* 一般是架构师做的
* 我们生产环境不是配置在eclipse里面
* 而是配置在TOMCAT里面的
*
* @author Leon.Sun
*
*/
public class Test003 {
public static void main(String[] args) {
byte[] b = null;
for (int i = 0; i < 10; i++) {
b = new byte[1 * 1024 * 1024];
}
}
}
版权声明:本文为Leon_Jinhai_Sun原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。