1.对象的创建过程:

    1.new 类名

    2.根据new的参数在常量池中定位一个类的符号的引用。

    3.如果没找到这个符号的引用,说明类还没有被加载。则进行类的加载,解析和初始化

    4.虚拟机为对象分配内存(位于堆中)。

    5.将分配的内存初始化为零(不包括对象头),即抽象属性初始化为null,基本数据类型初始化为0.

、   6.调用对象的<init>方法

2.给对象分配内存的方式:

    1.指针碰撞。这种方式前提是堆内存规整的并不是杂乱的,比如,将堆内存分为两块,一块是未使用的,一块是已经使用的。堆内存中未使用和已使用的交错存放则是不规整得 。

    2.空闲列表。这种方式适用于堆内存不规整的。原理:虚拟机必须维护一张列表,这张列表记录堆中哪些内存块可用,哪些不可用。当分配内存中,就从这表中找出一块可用的内存

    区域给新对象。再更新这张表。

    

    内存的分配方式是有java中的堆是否规整来决定。而堆的规整是由垃圾回收策略来决定的。如果垃圾回收的过程中如果堆内存的 压缩整理,则应该使用指针碰撞

    方式,反之则使用空闲列表。

3.在遇到高并发的情况下,给对象分配内存还会带来线程安全性问题。比如,一个线程进来给对象分配内存,在高并发的情况下,另外又有一个线程进来了,第一个线程还没来的及更新内存分配。而另外一个

线程刚好又申请了这块内存。这就导致了线程不安全问题。

    解决方式:

      1.线程同步。一个线程进来加一把锁,知道这个线程释放这把锁后,其他线程才能进来。这种方式也不失为一个解决办法。但是这种方式效率慢。

      2.本地线程分配缓冲(TLAB)。做法就是为每一个线程分配一块单独的内存区域。这样就解决了线程不安全问题。而且效率大大提高。如果单独的内存区域满了后,我们还可以

      继续利用线程同步再分配一块单独的内存区域给每一个线程。

JVM笔记4-对象的创建的更多相关文章

  1. jvm学习记录-对象的创建、对象的内存布局、对象的访问定位

    简述 今天继续写<深入理解java虚拟机>的对象创建的理解.这次和上次隔的时间有些长,是因为有些东西确实不好理解,就查阅各种资料,然后弄明白了才来做记录. (此文中所阐述的内容都是以Hot ...

  2. JVM学习-之对象的创建和内存分配

    最近看JVM内存模型,看了很多文章,大都讲到JVM将内存区域划分分:Mehtod-Area(No heap) 方法区,Heap(堆)区,Program Counter Register(程序计数器), ...

  3. JVM学习笔记:对象的创建

    第一步,类检测 1.当虚拟机遇到一条new指令时,首先判断new的对象是否能在运行时常量池中找到对应类的类名(书中原话:检查这个指令的参数能佛在常量池中定位到一个类的符号引用).如果没找到,应该就会抛 ...

  4. JVM中对象的创建过程

    JVM中对象的创建过程如以下流程图中所示: 对其主要步骤进行详细阐述: 为新生对象分配内存: 内存的分配方式: 指针碰撞:假设Java堆中内存是绝对规整的,所有用过的内存放在一边,空闲的内存在另一边, ...

  5. Java对象的创建 —— new之后JVM都做了什么?

    Java对象创建过程 1. 类加载检查 虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已经被加载.解析和初始化过.如果没 ...

  6. 【深入理解JVM】:Java对象的创建、内存布局、访问定位

    对象的创建 一个简单的创建对象语句Clazz instance = new Clazz();包含的主要过程包括了类加载检查.对象分配内存.并发处理.内存空间初始化.对象设置.执行ini方法等. 主要流 ...

  7. jvm学习(5) 对象的创建与结构

    上图表明:jvm虚拟机位于操作系统的堆中,并且,程序员写好的类加载到虚拟机执行的过程是:当一个classLoder启动的时候,classLoader的生存地点在jvm中的堆,然后它会去主机硬盘上将A. ...

  8. 面试题:JVM在Java堆中对对象的创建、内存结构、访问方式

    一.对象创建过程 1.检查类是否已被加载 JVM遇到new指令时,首先会去检查这个指令参数能否在常量池中定位到这个类的符号引用,检查这个符号引用代表的类是否已被加载.解析.初始化,若没有,则进行类加载 ...

  9. JVM的艺术-对象创建与内存分配机制深度剖析

    JVM的艺术-对象创建与内存分配机制深度剖析 引言 本章将介绍jvm的对象创建与内存分配.彻底带你了解jvm的创建过程以及内存分配的原理和区域,以及包含的内容. 对象的创建 类加载的过程 固定的类加载 ...

随机推荐

  1. oracle 查看最大连接数与当前连接数

    select count(*) from v$process --当前的连接数 select value from v$parameter where name = 'processes' --数据库 ...

  2. MySQL5.6安装(RPM)笔记

    1. 检查MySQL是否安装,如果有安装,则移除(rpm –e 名称)[root@localhost ~]# rpm -qa | grep -i mysqlmysql-libs-xxxxxxxxxx. ...

  3. 【转】一些常用的Vi命令,可帮助脱离鼠标

    使用Vi编写代码时,如果想脱离鼠标,需要使用一些命令快捷键,下面罗列了一些常用的并且容易记住的: 1. 命令模式下,移动光标或跳转 0到行首 ^到行首第一个非空字符 $到行尾非空字符 fx向后移动光标 ...

  4. Unity Android 5.6版本Resources.Load效率的问题

    0x00 前言 相信不少使用Unity的小伙伴都听说过,甚至也亲身经历过在Unity5.6最初的几个版本中使用Resources.Load方法加载资源变--慢的问题. 这个问题的确是存在的,比如这个i ...

  5. Cypher查询语言--Neo4j 综合(四)

    目录 返回节点 返回关系 返回属性 带特殊字符的标识符 列的别名 可选属性 特别的结果   查询中的返回部分,返回途中定义的感兴趣的部分.可以为节点.关系或其上的属性. 图 返回节点 返回一个节点,在 ...

  6. python面向对象编程之组合

    前面讲了面向类与对象的继承,知道了继承是一种什么"是"什么的关系. 然而类与类之间还有另一种关系,这就是组合 先来看两个例子: 先定义两个类,一个老师类,老师类有名字,年龄,出生的 ...

  7. iOS-Wonderful 完美颜色库

    开发中颜色的使用也是非常频繁的,这里推荐一个dsxNiubility大牛写的颜色库:Wonderful:它的好用就是很清楚的把每个常用的颜色进行了由浅到深的分层,让我们使用时可以根据自己对颜色的深浅直 ...

  8. Kafka基本知识回顾及复制

    Producers发布记录到集群,集群维护这些记录并且将记录分发给Consumers. 在Kafka中,最关键的抽象是topic.Producers发布记录到一个topic,Consumers订阅一个 ...

  9. 浅析Numpy.genfromtxt及File I/O讲解

    Python 并没有提供数组功能,虽然列表 (list) 可以完成基本的数组功能,但它并不是真正的数组,而且在数据量较大时,使用列表的速度就会慢的让人难受.为此,Numpy 提供了真正的数组功能,以及 ...

  10. MIT-线性代数笔记(1-6)

    学习目录 第 01 讲 行图像和列图像 第 02 讲 矩阵消元 第 03 讲 矩阵的乘法和逆矩阵 第 04 讲 矩阵的LU 分解 第 05 讲 转置.置换和空间 第 06 讲 列空间和零空间 第 07 ...