对象是面向对象设计语言无法回避的东西,可见其重要性,JAVA的对象相较于C++来说,不算很复杂,但是我们看到一句话背后往往有很多东西值得探讨(NEW关键字)。

对象如何被创建?

首先一句简单的NEW语句,比如:StringBuffer string = new StringBuffer("abcd!");  假设这句话在主线程里(主方法线程),那么JVM会在常量池中定位这个类的引用符号,看看这个类在方法区中是否被加载,如果没有就去加载这个类,接下来,在堆中寻找是否有值为“abcd!”的StringBuffer类的实例,如果有就直接让虚拟机栈中的引用(这个引用就是string)指向这块区域,没有的话就要在堆中分配内存了,用以存储对象实例,如何分配内存呢?那就要看堆是怎么存储数据的了,如果堆是很零散的存放数据(这样会产生很多内存碎片),为了保证分配内存成功,不排除会移动堆中数据的可能,这些都通过一张“空闲列表”来记录;如果堆是很整齐的存放数据,那么只需移动分界指针就够了;貌似第一种存储方式是常用的。内存分配好了就需要初始化数据,JVM会默认把所有数据变成各个类型的默认值。最后才会用构造方法再赋一遍初值。如果对多线程理解较深的人,会发现如果不对内存分配进行一些设置会产生同步问题,这里不做记录。

对象的内存布局:

对象的内存布局可分为三块区域,对象头、实例数据、对齐填充。

对象头包括两部分,第一部分存储运行时数据、哈希吗、锁状态等必备数据,第二部分存放指向该类元数据(方法区中)的类型指针。

实例数据,对象实例中存储的有效信息,成员体的值。

对齐填充,这个没什么,只是由于JVM的某些规则所引起的。

对象的访问定位:

在虚拟机栈的栈顶帧中,会为方法中的每个对象创建一个引用,对象就是通过引用来定位到堆中的实例的,堆中不会有同一个类的相同实例数据,也就说如果两个对象的内容完全一样,那么他们的引用也是相等的(指向同一块内存),改变对象,有时候可能仅仅是改变引用的位置(当堆中存在改变后的实例时)

读书笔记jvm探秘之二: 对象创建的更多相关文章

  1. 读书笔记jvm探秘之一:内存概况

    jvm内存大致可以分为六大块: 堆,虚拟机主要内存,可以形象的说,堆是对象的存储库,几乎所有的对象实例和数组都在此分配内存,当然也死于此,jvm垃圾回收机制(简称GC)主要处理的就是这个地方.它被所有 ...

  2. JVM探秘:Java对象

    本系列笔记主要基于<深入理解Java虚拟机:JVM高级特性与最佳实践 第2版>,是这本书的读书笔记. 对象的创建 虚拟机遇到一条 new 指令时,首先去检查这个指令的参数是否能在方法区常量 ...

  3. Java虚拟机(二)-对象创建

    这一篇大致说明一下,对象在Java堆中对象分配.内存布局以及访问定位 1.对象的创建 虚拟机在遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引 ...

  4. [redis读书笔记] 第一部分 数据结构与对象 简单动态字符串

    本读书笔记主要来自于<<redis设计与实现>> -- 黄键宏(huangz) redis主要设计了字符串,链表,字典,跳跃表,整数集合,压缩列表来做为基本的数据结构,实现键值 ...

  5. 【读书笔记 - Effective Java】05. 避免创建不必要的对象

    1. 如果对象是不可变的(immutable),它就始终可以被重用. (1) 特别是String类型的对象. String str1 = new String("str"); // ...

  6. 【读书笔记】《Effective Java》——创建和销毁对象

    Item 1. 考虑用静态工厂方法替代构造器 获得一个类的实例时我们都会采取一个共有的构造器.Foo x = new Foo(): 同时我们应该掌握另一种方法就是静态工厂方法(static facto ...

  7. 读书笔记_Effective_C++_条款二十八:避免返回handlers指向对象内部成分

    举个例子: class Student { private: int ID; string name; public: string& GetName() { return name; } } ...

  8. 读书笔记_Effective_C++_条款二十一:当必须返回对象时,别妄想返回其reference

    在栈空间的临时成员变量在函数生命期结束后无法传出 friend A& operator*(const A& a, const A& b) { A temp; temp.data ...

  9. 读书笔记-JVM

    局部变量表(虚拟机栈中的一部分)在编译期完成分配,运行期不会再改变大小: 每个方法对应一个栈帧(存储局部变量表.操作数栈.动态链接.方法出口等),栈帧被存储到虚拟机栈中,每个线程对应一个虚拟机栈,方法 ...

随机推荐

  1. 使用SpringSession管理分布式会话时遇到的反序列化问题

    关于SpringSession相关的介绍和使用指南,可移步如下网址: [SpringSession管理分布式系统的会话Session] https://www.cnblogs.com/captaina ...

  2. httpclient通过post提交到webapi

    var client = new HttpClient(); var url = BASConfig.Instance.SiteSettingsModule.SyncWorkLogAppUrl; va ...

  3. bootstrap Table的 一些小操作

    function HQCreatTable(ob) { var option = { cache: false,//是否使用缓存,默认为true,所以一般情况下需要设置一下这个属性(*) scroll ...

  4. 利用BenchmarkDotNet 测试 .Net Core API 同步和异步方法性能

    事由: 这两天mentor给我布置了个任务让我用BenchmarkDotNet工具去测试一下同一个API 用同步和异步方法写性能上有什么差别. 顺带提一下: 啊啊啊啊 等我仔细看文档的时候文档 发现它 ...

  5. 从零开始的全栈工程师——js篇2.3

    自加和自减 =赋值运算 他的顺序是从右往左 从后往前 var a=12; 声明一个变量并将12赋值给aa=a+2; 将a+2赋值给a简写a+=3; a=a+3a+=1; a++ 在自己原有的基础上加1 ...

  6. cf314E. Sereja and Squares(dp)

    题意 题目链接 给你一个擦去了部分左括号和全部右括号的括号序列,括号有25种,用除x之外的小写字母a~z表示.求有多少种合法的括号序列.答案对4294967296取模.合法序列不能相交,如()[],( ...

  7. es6-异步应用

    异步编程对 JavaScript 语言太重要.Javascript 语言的执行环境是“单线程”的,如果没有异步编程,根本没法用,非卡死不可.本章主要介绍 Generator 函数如何完成异步操作. 传 ...

  8. 使用Docx.dll插入图片在Centos 7 上报错:system.DllNotFound:libgdiplus.so

    熬了N天,终于把WORD 文档打开替换.插入图片完好,部署,本机测试没有问题 可是一放到服务器(Centos 7) 就提示下面的错误: 度娘一下: https://www.cnblogs.com/xi ...

  9. grunt + sass 使用记录

    环境依赖 Nodejs for grunt Ruby for sass 配置文件 package.json { "name": "app", "ver ...

  10. 企业常用的站内收索、QQ群、在线客服

    <div class="toplinks">            <form target="_blank">             ...