精华内容
下载资源
问答
  • 如果synchronized(new Object){} 和 Object obj = new Object(); synchronized(obj){}的区别是什么? 主要是在synchronized()中放new Object 是四个线程一起,而放obj对象是一个一个的执行,这是什么原因呢? 代码...
  • new object() 和 new object区别

    千次阅读 2019-07-17 17:36:21
    new 对象时如果后面有(): 如果有自定义默认构造函数则会调用;如果没有则会调用编译器合成的默认构造函数,对内存初始化 struct Student { int a; char * p; }; void foo() { Student* pStu1 = new ...

    ① new 对象时如果后面有():

        如果有自定义默认构造函数则会调用;如果没有则会调用编译器合成的默认构造函数,对内存初始化

    struct Student
    {
        int a;
        char * p;
    };
    
    void foo()
    {
        Student* pStu1 = new Student;  // a 和 p 值不会被初始化
        Student* pStu2 = new Student();// a = 0 , p = Null 
    }

     

    ② new 对象时如果后面没有():

        如果有自定义默认构造函数则会调用; 如果没有则不会调用;

    struct Student
    {
        Student()
        {
            a = 50;
            p = "Hello World";
        }
        int a;
        const char* p;
    };
    
    void foo()
    {
        Student* pStu1 = new Student;      // a = 50 p = "Hello World";
        Student* pStu2 = new Student();
    }

     

    展开全文
  • Object.create() 与 new Object()区别

    千次阅读 2019-02-23 13:48:23
    参考文档《Object.create() 和 new Object()》添加链接描述 Object.cerate() 必须接收一个对象参数,创建的新对象的原型指向接收的参数对象,new Object() 创建的新对象的原型指向的是 Object.prototype. (表述有点...

    参考文档《Object.create() 和 new Object()》添加链接描述
    Object.cerate() 必须接收一个对象参数,创建的新对象的原型指向接收的参数对象,new Object() 创建的新对象的原型指向的是 Object.prototype. (表述有点啰嗦,简洁点说就是前者继承指定对象, 后者继承内置对象Object)
    可以通过Object.create(null) 创建一个干净的对象,也就是没有原型,而 new Object() 创建的对象是 Object的实例,原型永远指向Object.prototype.

    展开全文
  • Object o = new Object()深度解析

    千次阅读 2019-12-04 17:27:34
    Object o = new Object(); 对象初始化过程 申请内存 初始化成员变量 0 设置初始值 8 对象头包括什么 锁的信息 Gc标记信息 标记清除算法 GC年龄(4位最大15) 为什么标记清除算法标记年龄最大15 对象头GC标记信息...

    Object o = new Object();

    对象初始化过程

    申请内存
    初始化成员变量   0
    设置初始值     8 


    对象头包括什么

    锁的信息
    Gc标记信息 标记清除算法 GC年龄(4位最大15)  为什么标记清除算法标记年龄最大15 对象头GC标记信息最大4位
    hash码
    八个字节
    64位

    栈不需要垃圾回收,直接弹出


    一个boject占多少个字节?
    最小16个字节 8+4+4 然后8的倍数对齐 24 32..  (HotSpot要求对象的总长度必须是8字节的整数倍)

    数组
    最小是24个字节 8+4+4+4+8

     

     

     

    展开全文
  • 关注公众号免费领取技术书籍和面试资料 前言 我们来分析一下堆内布局以及Java对象... private Object obj1 = new Object(); public static void main(String[] args) { Object obj2 = new Object(); } } 123456789

    关注公众号免费领取技术书籍和面试资料
    在这里插入图片描述

    前言

    我们来分析一下堆内布局以及Java对象在内存中的布局吧。

    对象的指向
    先来看一段代码:
    
    package com.zwx.jvm;
    
    public class HeapMemory {
        private Object obj1 = new Object();
    
        public static void main(String[] args) {
            Object obj2 = new Object();
        }
    }
    123456789
    上面的代码中,obj1 和obj2在内存中有什么区别?
    

    我们先来回忆一下JVM系列1的文章中有提到,方法区存储每个类的结构,比如:运行时常量池、属性和方法数据,以及方法和构造函数等数据。所以我们这个obj1是存在方法区的,而new会创建一个对象实例,对象实例是存储在堆内的,于是就有了下面这幅图(方法区指向堆):而obj2 是属于方法内的局部变量,存储在Java虚拟机栈内的栈帧中的局部变量表内,这就是经典的栈指向堆:这里我们再来思考一下,我们一个变量指向了堆,而堆内只是存储了一个实例对象,那么堆内的示例对象是如何知道自己属于哪个Class,也就是说这个实例是如何知道自己所对应的类元信息的呢?这就涉及到了一个Java对象在内存中是如何布局的。

    Java内存模型

    对象内存中可以分为三块区域:对象头(Header),实例数据(Instance Data)和对齐填充(Padding),以64位操作系统为例(未开启指针压缩的情况) Java对象布局如下图所示:其中对象头中的Mark Word中的详细信息在文章synchronized锁升级原理中有详细介绍。上图中的对齐填充不是一定有的,如果对象头和实例数据加起来刚好是8字节的倍数,那么就不需要对齐填充。

    知道了Java内存布局,那么我们来看一个面试问题

    Object obj=new Object()占用字节
    这是网上很多人都会提到的一个问题,那么结合上面的Java内存布局,我们来分析下,以64位操作系统为例,new Object()占用大小分为两种情况:

    未开启指针压缩 占用大小为:8(Mark Word)+8(Class Pointer)=16字节
    开启了指针压缩(默认是开启的) 开启指针压缩后,Class Pointer会被压缩为4字节,最终大小为:8(Mark Word)+4(Class Pointer)+4(对齐填充)=16字节
    结果到底是不是这个呢?我们来验证一下。首先引入一个pom依赖:

    <dependency>
                <groupId>org.openjdk.jol</groupId>
                <artifactId>jol-core</artifactId>
                <version>0.10</version>
            </dependency>
    12345
    

    然后新建一个简单的demo:

    package com.zwx.jvm;
    
    import org.openjdk.jol.info.ClassLayout;
    
    public class HeapMemory {
        public static void main(String[] args) {
            Object obj = new Object();
            System.out.println(ClassLayout.parseInstance(obj).toPrintable());
        }
    }
    12345678910
    输出结果如下:最后的结果是16字节,没有问题,这是因为默认开启了指针压缩,那我们现在把指针压缩关闭之后再去试试。
    
    -XX:+UseCompressedOops  开启指针压缩
    -XX:-UseCompressedOops  关闭指针压缩
    12
    再次运行,得到如下结果:可以看到,这时候已经没有了对齐填充部分了,但是占用大小还是16位。
    
    下面我们再来演示一下如果一个对象中带有属性之后的大小。
    
    新建一个类,内部只有一个byte属性:
    
    package com.zwx.jvm;
    
    public class MyItem {
        byte i = 0;
    }
    12345
    然后分别在开启指针压缩和关闭指针压缩的场景下分别输出这个类的大小。
    
    package com.zwx.jvm;
    
    import org.openjdk.jol.info.ClassLayout;
    
    public class HeapMemory {
        public static void main(String[] args) {
            MyItem myItem = new MyItem();
            System.out.println(ClassLayout.parseInstance(myItem).toPrintable());
        }
    }
    12345678910
    

    开启指针压缩,占用16字节:关闭指针压缩,占用24字节:这个时候就能看出来开启了指针压缩的优势了,如果不断创建大量对象,指针压缩对性能还是有一定优化的。

    对象的访问
    创建好一个对象之后,当然需要去访问它,那么当我们需要访问一个对象的时候,是如何定位到对象的呢?目前最主流的访问对象方式有两种:句柄访问和直接指针访问。

    句柄访问 使用句柄访问的话,Java虚拟机会在堆内划分出一块内存来存储句柄池,那么对象当中存储的就是句柄地址,然后句柄池中才会存储对象实例数据和对象类型数据地址。
    直接指针访问(Hot Spot虚拟机采用的方式) 直接指针访问的话对象中就会直接存储对象类型数据。
    句柄访问和直接指针访问对比
    上面图形中我们很容易对比,就是如果使用句柄访问的时候,会多了一次指针定位,但是他也有一个好处就是,假如一个对象被移动(地址改变了),那么只需要改变句柄池的指向就可以了,不需要修改reference对象内的指向,而如果使用直接指针访问,就还需要到局部变量表内修改reference指向。

    堆内存
    上面我们提到,在Java对象头当中的Mark Word存储了对象的分代年龄,那么什么是分代年龄呢?

    一个对象的分代年龄可以理解为垃圾回收次数,当一个对象经过一次垃圾回收之后还存在,那么分代年龄就会加1,在64位的虚拟机中,分代年龄占了4位,最大值为15。分代年龄默认为0000,随着垃圾回收次数,会逐渐递增。

    Java堆内存中按照分代年龄来划分,分为Young区和Old区,对象分配首先会到Young区,达到一定分代年龄(-XX:MaxTenuringThreshold可以设置大小,默认为15)就会进入Old区(注意:如果一个对象太大,那么就会直接进入Old区)。

    之所以会这么划分是因为如果整个堆只有一个区的话,那么垃圾回收的时候每次都需要把堆内所有对象都扫描一遍,浪费性能。而其实大部分Java对象的生命周期都是很短的,一旦一个对象回收很多次都回收不掉,可以认为下一次垃圾回收的时候可能也回收不掉,所以Young区和Old区的垃圾回收可以分开进行,只有当Young区在进行垃圾回收之后还是没有腾出空间,那么再去触发Old区的垃圾回收。

    Young区
    现在拆分成了Young区,那我们看下面一个场景,下面的Young是经过垃圾回收之后的一个概图:假如说现在来了一个对象,要占用2个对象的大小,会发现放不下去了,这时候就会触发GC(垃圾回收),但是一旦触发了GC(垃圾回收),对用户线程是有影响的,因为GC过程中为了确保对象引用不会不断变化,需要停止所有用户线程,Sun把这个事件称之为:Stop the World(STW)。这些在下一篇讲解垃圾回收的时候会详细介绍,这里先不深入。

    所以说一般是越少GC越好,而实际上上图中可以看到至少还可以放入3个对象,只要按照对象都按照顺序放好,那么是可以放得下的,所以这就产生了问题了,明明有空间,但是因为空间不连续,导致对象申请内存失败,导致触发GC了,那么如何解决这种问题呢?

    解决的思路就是把Young区的对象按顺序放好,所以就产生了一个方法,把Young区再次划分一下,分为2个区:Eden区和Survivor区。具体操作是:一个对象来了之后,先分配到Eden区,Eden区满了之后,触发GC,经过GC之后,为了防止空间不连续,把幸存下来的对象复制到Survivor区,然后Eden区就可以完整清理掉了,当然这么做是有一个前提的,就是大部分对象都是生命周期极短的,基本一次垃圾回收就可以把Eden区大部分对象回收掉(这个前提是经过测试总结得到的)。

    触发GC的时候Survivor区也会一起回收,并不是说单独只触发Eden区,但是这样问题又来了,Eden区是保证空间基本连续了,但是Survivor区又可能产生空间碎片,导致不连续了,所以就又把Survivor区给一分为二了:这个时候工作流程又变成这样了:首先还是在Eden区分配空间,Eden区满了之后触发GC,GC之后把幸存对象 复制到S0区(S1区是空的),然后继续在Eden区分配对象,再次触发GC之后如果发现S0区放不下了(产生空间碎片,实际还有空间),那么就把S0区对象复制到S1区,并把幸存对象也复制到S1区,这时候S0区是空的了,并依次反复操作,假如说S0区或者S1区空间对象复制移动了之后还是放不下,那就说明这时候是真的满了,那就去老年区借点空间过来(这就是担保机制,老年代需要提供这种空间分配担保),假如说老年区空间也不够了,那就会触发Full GC,如果还是不够,那就会抛出OutOfMemeoyError异常了。

    注意:为了确保S0和S1两个区域之间每次复制都能顺利进行,S0和S1两个区的大小必须要保持一致,而且同一时间有一个区域一定是空的。虽然说这种做法是会导致了一小部分空间的浪费,但是综合其他性能的提升来说,是值得的。

    Old区
    当Young区的对象达到设置的分代年龄之后,对象会进入Old区,Old区满了之后会触发Full GC,如果还是清理不掉空间,那么就抛出OutOfMemeoyError异常。

    名词扫盲
    上面提到了很多新的名词,而实际上很多这种名词还有其他叫法,这个还是觉得有必要了解一下。

    垃圾回收:简称GC。
    Minor GC:针对新生代的GC
    Major GC:针对老年代的GC,一般老年代触发GC的同时也会触发Minor GC,也就等于触发了Full GC。
    Full GC:新生代+老年代同时发生GC。
    Young区:新生代
    Old区:老年代
    Eden区:暂时没发现有什么中文翻译(伊甸园?)
    Surcivor区:幸存区
    S0和S1:也称之为from区和to区,注意from和to两个区是不断互换身份的,且S0和S1一定要相等,并且保证一块区域是空的
    一个对象的人生轨迹图
    从上面的介绍大家应该有一个大致的印象,一个对象会在Eden区,S0区,S1区,Old区不断流转(当然,一开始就会被回收的短命对象除外),我们可以得到下面的一个流程图:

    总结
    本文主要介绍了一个Java对象在堆内是如何存储的,并结合Java对象的内存布局示范了一个普通对象占用大小问题,然后还分析了堆内的空间划分以及划分原因,本文中涉及到了GC相关知识均没有深入讲解,关于GC及GC算法和GC收集器等相关知识将放在下一篇进行详细分析。

    展开全文
  • ue4 NewObject

    千次阅读 2016-12-06 14:53:20
    ue4 NewObject/StaticConstructObject_Internal/StaticAllocateObject/FObjectInitializer:对象创建和初始化 UObject是一套很复杂的体系,之前读ue3代码时曾分析过其类型系统实现,主要是与UClas
  • 想要知道 Object o = new Object();在内存中占用了多少字节,可以使用如下方法直观的看到。 maven中添加依赖 <dependency> <groupId>org.openjdk.jol</groupId> <artifactId>jol-core&...
  • new Object()中传入参数的用法

    千次阅读 2017-12-01 18:38:22
    new Object()中传入参数的用法
  • 说说new object()、new Array()和var data=[]

    千次阅读 2018-04-19 09:45:25
    写在开头,作为一个只会重构菜鸟...var o ={} === var o = new Object();var a =[] === var a = new Array();1.new object() $.ajax({ type:"get", url:"../js/text.json...
  • static Object o1 = new Object(); //在Object前面加static与不加对synchronized有什么影响,为什么执行结果不一样 static Object o2 = new Object(); //synchronized参数都可以是什么 public int flag = 0; ...
  • js 中new Object 和 {}的区别

    千次阅读 2016-09-03 16:29:15
    来自:... var Obj = function() {}; ...var b = new Object(); var c = new Obj(); 這樣纔可以。結果 c 遠快於 a 和 b,a 略快於 b。 然而 var Vec = function(a, b) { thi
  • new Object()注入到Spring容器public class UserDao { @Resource AccountService accountService; public void print(){ System.out.println(accountService); } }比如有以上这个类,实现将new UserDao()...
  • 在JavaScript当中创建一个对象有两种语法,一种是通过字面量的形式,另外一种是通过new Object()的形式 下面具体介绍一下两种方式如何使用,我们将创建一个person对象 它有 name,age,sex等属性。 1.字面量形式...
  • Object.create()和new object()和{}的区别

    千次阅读 2018-07-25 15:53:11
    Object.create()介绍 Object.create(null) 创建的对象是一个空对象,在该对象上没有继承 Object.prototype 原型链上的属性或者方法,例如:toString(), hasOwnProperty()等方法 Object.create()方法接受两个参数:...
  • Object.create() 和 new Object()

    千次阅读 2019-01-12 16:00:32
    object.create(proto, propertiesObject) object.create() 是使用指定的原型proto对象及其属性propertiesObject去创建一个新的对象。(mdn) proto 是必填参数,就是新创建出来的对象的原型 (新对象的 __proto__属性...
  • JS Object() 与 new Object()的区别

    万次阅读 2018-04-06 23:12:06
    //无意间看到这段代码 function ... var prototype = Object(superType.prototype); prototype.constructor = subType; subType.prototype = prototype; } // 以上是原型继承的优化方法 // 看到这个O...
  • 例如:我创建了一个Node类,里面包含三个private属性previous,obj跟next;为什么我用Node node=null;然后node.setObj(obj)就会报nullPointer的错误...而用Node node=new Node(); 然后再node.setObj(obj)就不会报错。
  • Object.create(null)和new Object的区别

    千次阅读 2016-11-28 14:25:18
    可以看到,object.create(null)造出来的object是没有任何属性的,是空的
  • 原文:http://zhidao.baidu.com/link?url=G057tERsdTZUDihwpY-ASA1ZnkUtwgmYQRF-aHOcyPy2u_O1MIA1oifEjTBpQqZ5rPSg8sNdydsb2L0feASYCa ...js和其它语言一样,一切对象的基类都是Object,所以,new Object()和简易的{}
  • JPA 操作数据库,在...nested exception is java.lang.IllegalStateException: During synchronization a new object was found through a relationship that was not marked cascade PERSIST 解决方法: 在@On
  • js: new Object()与Object.create()的区别

    千次阅读 2019-05-22 09:37:59
    Object.create(proto, [propertiesObject]) //方法创建一个新对象,使用现有的对象来提供新创建的对象的proto。 参数: proto : 必须。表示新建对象的原型对象,即该参数会被赋值到目标对象(即新对象,或说是最后...
  • object对象在内存中占用多少字节 参考:https://www.jianshu.com/p/91e398d5d17c markword 8字节,因为java默认使用了calssPointer压缩,classpointer 4字节,padding 4字节 因此是16字节 如果没开启classpointer...
  • 这一章节我们来讨论一下由同步的synchronized (newobject()) 引起的异步现象。1.代码清单package com.ray.deepintothread.ch02.topic_14; /** * * @author RayLee * */ public class ...
  • Object[] objects = new Object[12]; 第一个问题,Object类型意味着每个元素可以放任意体积的数据,这里需要开辟12个房间。java如何知道这块内存要开多大?等到用户装数据时再开内存吗?java不是遇到new就马上开...
  • (function(){ if(typeof StringBuilder== 'undefined'){ StringBuilder=function(initialText) { var _parts = new Array(); if ((ty
  • 目录 概述 ...但是接下来一句话让我心灰意冷 啊,你知道Object obj=new Object()占多少字节吗?我男朋友问我,我内心真的是一万头***奔腾而过啊,处于耿直的程序员,我们来看一下对象到底占用多...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,819,666
精华内容 1,127,866
关键字:

newobject