关于JVM对象分配的小实验

首先来看看JVM虚拟机对于对象的空间分配有哪几种方式:

栈上分配(JVM默认开启栈上优化)
线程私有、小对象(方法结束栈清空不需要垃圾收集)
无逃逸(方法结束,对象消失。如果仍然有其它对象持有它的引用,说明逃逸了(作用域逃出了方法))
1
-XX:+UseTLAB
2
-XX:+DoEscapeAnalysis   //使用逃逸分析---可以在栈上分配对象(不使用则不能分配)
3
-XX:+EliminateAllocations  //使用标量替换
线程本地分配(分配在每个线程的工作内存,在eden区分配,但属于自己线程的专属空间)
占用eden 1%
自己线程所有,不用竞争加锁(分配速度快)
小对象
-XX:+UseTLAB
1
-XX:+UseTLAB
老年代分配(堆)
大对象

新生代eden分配(堆)
普通对象

实验代码:(main方法不断调用User的alloc方法new了10000000个对象)
1
public class TestHeapAllocate {
2
    class User {
3
        int id;
4
        String name;
5
        User(int id, String name){
6
            this.id = id;
7
            this.name = name;
8
        }
9
10
    }
11
12
    void alloc(int i){
13
        new User(i,"name" + i);
14
    }
15
16
    public static void main(String[] args){
17
        TestHeapAllocate t = new TestHeapAllocate();
18
        long s1 = System.currentTimeMillis();
19
        for (int i = 0; i<10000000 ; i++) t.alloc(i);
20
        long s2 = System.currentTimeMillis();
21
        System.out.println(s2-s1);
22
    }
23
}
实验一:关闭引用逃逸运行代码(无法在栈上分配、无法在本地缓存分配)



实验结果:



 实验二:关闭引用逃逸打开TLAB本地缓存运行代码(无法在栈上分配,可以在本地缓存分配)


  实验结果:



实验三:打开引用逃逸和TLAB本地缓存运行代码(可以栈上分配、也可以在本地缓存分配)
 
实验结果:



可以明显看到实验三的分配对象方法速度最快

总结:
打开了引用逃逸分析(开启栈上分配)和TLAB本地缓存可以优化jvm分配内存的速度,对于对象的分配操作,可以选择开启这JVM的两种分配模式来提高性能。





你可能感兴趣的:(JVM调优系列)