ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

对象创建过程

2022-08-25 12:31:40  阅读:190  来源: 互联网

标签:对象 创建 Dog dog 逃逸 标量 new 过程


创建对象的几种方式

  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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有