案例一
public class test1 {
private static final int _1MB = 1024 * 1024;
public static void main(String[] args) throws IOException, InterruptedException {
System.out.println("My Process Id is:"+getProcessID());
Thread.sleep(10000);
byte[] all1 = new byte[ 2 * _1MB];
byte[] all2 = new byte[ 2 * _1MB];
Thread.sleep(2000);
byte[] all3 = new byte[ 2 * _1MB];
byte[] all4 = new byte[ 7 * _1MB];
System.in.read();
}
public static int getProcessID() {
RuntimeMXBean runtimeMXBean = ManagementFactory.getRuntimeMXBean();
return Integer.valueOf(runtimeMXBean.getName().split("@")[0])
.intValue();
}
}
复制代码
注:这里getProcessId的作用是拿到进程号
jvm参数
-Xmx20m // 设置最大堆大小
-Xms20m // 设置最小堆大小,一般和-Xmx一致
-Xmn10m // 设置新生代大小
-XX:+UseParNewGC //表示新生代使用ParNewGc
-XX:+UseConcMarkSweepGC // 表示老年代使用CMS
-XX:+UseCMSInitiatingOccupancyOnly //表示CMS不基于运行时收集数据来进行GC控制
-XX:CMSInitiatingOccupancyFraction=75 //而表示当老年代使用率到达阈值75%时触发
复制代码
我们这么设置JVM参数,就可以看出一些基本设置:
-
年轻代 10M
-
老年代 10M
-
eden:s0:s1 = 8:1:1
-
新生代使用ParNewGc
-
老年代使用CMS,并只有当老年代使用率超过75的时候触发FullGC
我们先简单看一下这么设置有什么问题:
代码里先创建了 2M的对象,直接放入eden区,再创建了2M的对象,同样也放入eden区,此时eden 有4M的对象,再创建了2M的对象,eden有4M,可以放更多,这2M也放进