一.啥叫逃逸分析?
一般对象是分配在堆中的,而开启了JVM的逃逸分析后,对象很可能就会被分配在线程栈上.是一种JVM的优化技术手段。
二.如何开启?
JVM1.7后默认开启了逃逸分析 -XX:+DoEscapeAnalysis,作为优化手段。
三.通过对应jmap工具来进一步分析?
这里写循环new 五十万个对象分别启用逃逸分析和 关闭逃逸分析进行观察
3.1. 首先通过jps命令,查看对应java进程
3.2. 通过jmap抓取堆空间元素
jmap –histo 8480
备注:可通过jmap –help命令来学习jmap
为啥我new 了 50万次student对象,结果只有十几万对象在堆上面?
因为JVM默认开启了逃逸分析,大部分对象会被分配到线程栈上面去了~!
如何关闭JVM的逃逸分析?
在启动时给加上:-XX:-DoEscapeAnalysis ,关闭逃逸分析后,这五十万个对象全部落 在堆上,符合结论!
四.对应代码
package com.multiThread.wang;
public class TestJmap {
public static void main(String[] args) throws InterruptedException {
for (int i = 0; i < 500000; i++) {
if(i%10000 == 0){
Thread.sleep(500);
}
generateStu();
}
System.out.println("test jps , jmap");
Thread.sleep(10000);
}
public static Student generateStu(){
Student student = new Student();
return student;
}
}
class Student{
String name;
String address;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
五. 小结
JVM的逃逸分析在1.7后自动开启,可用于将某些非逃逸的对象给分配在线程栈中,减轻了堆的压力。是一种JVM的优化手段。jps可用于查看java进程的小工具,jmap -histo 也可用于查看堆资源的小工具。