对象创建过程
作者:互联网
创建对象的几种方式
1. new关键字 Object obj = new Object();
2. 反射
3.克隆
4.反序列化
创建对象的过程
对象都是在堆中么?(逃逸)
逃逸的基本行为是分析对象的动态作用域,分析指针动态范围的方法称之为逃逸分析 当变量(或者对象)在方法中分配后,其指针有可能被返回或者被全局引用,这样就会被其他过程或者线程所引用,这种现象称作指针(或者引用)的逃逸(Escape)。
1.方法逃逸
//方法逃逸 public Dog testEscape(){ Dog dog = new Dog(); return dog; }
//未发生方法逃逸 public void testEscape(){ Dog dog = new Dog(); dog.run(); }
2.线程逃逸
//线程逃逸 public static void testEscape(){ Dog dog = new Dog("小黑"); new Thread(new Runnable() { @Override public void run() { dog.run(); } }).start(); }
3.栈上分配
在一般应用中,不会逃逸的局部对象占比很大,如果使用栈上分配,那大量对象会随着方法结束而自动销毁,垃圾回收系统压力就小很多。
4.同步消除
线程同步本身比较耗时,如果确定一个变量不会逃逸出线程,无法被其它线程访问到,那这个变量的读写就不会存在竞争,对这个变量的同步措施可以清除。
5.标量替换。
(1)标量就是不可分割的量,java中基本数据类型,reference类型都是标量。相对的一个数据可以继续分解,它就是聚合量(aggregate)。
(2)如果把一个对象拆散,将其成员变量恢复到基本类型来访问就叫做标量替换。
(3) 如果逃逸分析证明一个对象不会被外部访问,并且这个对象可以被拆散的话,那么程序真正执行的时候将可能不创建这个对象,而改为直接在>栈上创建若干个成员变量。
6.相关JVM参数
-XX:+DoEscapeAnalysis 开启逃逸分析
-XX:+PrintEscapeAnalysis 开启逃逸分析后,可通过此参数查看分析结果。
-XX:+EliminateAllocations 开启标量替换
-XX:+EliminateLocks 开启同步消除
-XX:+PrintEliminateAllocations 开启标量替换后,查看标量替换情况
7.总结
如果项目中的大部分方法中的对象都不会逃逸,那么可以开启逃逸分析、开启标量替换、开启同步擦除。
标签:对象,创建,Dog,dog,逃逸,标量,new,过程 来源: https://www.cnblogs.com/xinay/p/16622736.html