对象是面向对象设计语言无法回避的东西,可见其重要性,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. webpack.config.js====配置babel

    参考:https://www.jianshu.com/p/9808f550c6a91. 安装依赖babel-loader: 负责 es6 语法转化babel-preset-env: 包含 es6.7 ...

  2. 关于Arduino项目的构建思想-转自openbook开源杂志

  3. mybatis-plus 异常 Invalid bound statement (not found)

    最近吧项目中添加使用了mybatis-plus,发现操作sql的时候出现异常: Invalid bound statement (not found) ,异常位置位于mybatis-plus的jar中 ...

  4. 零基础逆向工程31_Win32_05_提取图标_修改标题

    在程序中使用图标 1.加载图标 HICON hIcon; hIcon = LoadIcon (hAppInstance, MAKEINTRESOURCE (IDI_ICON)); hAppInstan ...

  5. 转:WPF中ListBox的创建和多种绑定用法

    先从最容易的开始演示ListBox控件的创建. Adding ListBox Items下面的代码是向ListBox控件中添加多项ListBoxItem集合.XAML代码如下:<ListBox ...

  6. [SVN]TortoiseSVN报“500 Internal Server Error”错误的解决方法

    背景:由于某种原因,本人重启了一下SVN服务的物理机,重启过后发现所有人访问SVN都报如下错误. 由于重启之前是没有做过任何改动,所以面对这个错误有点摸不着头脑,防火墙.网管.清缓存等方法都试过,还没 ...

  7. bootstrap table保留多选框的分页

    有时候需要完成这种情况: 1.需要设置的是如果第一页点击复选框然后点击其他页面的话,第一页的选项被保存了 2.将所有选择好的复选款的数据保存在数组中 bootstrap table官方文档http:/ ...

  8. map 容器(copy)

    Map是c++的一个标准容器,她提供了很好一对一的关系,在一些程序中建立一个map可以起到事半功倍的效果,总结了一些map基本简单实用的操作!1. map最基本的构造函数:   map<stri ...

  9. vuejs数据和事件

    <body> <div id='root'>{{number}}</div> <script> new Vue({ el:'#root', data:{ ...

  10. Zend Studio 12.5.1原版安装破解

    安装官方Zend Studio 12.5.1原版,关闭zend studio,然后将破解补丁com.zend.verifier_12.5.1.v20150514-2003.jar覆盖到 安装目录\pl ...