`
什么都不懂的孩子
  • 浏览: 26883 次
社区版块
存档分类
最新评论

JVM创建对象过程

 
阅读更多

<div class="iteye-blog-content-contain" style="font-size: 14px"></div>

 1、找到类对象

<!--?xml version="1.0" encoding="UTF-8" standalone="no"?-->
     当碰到new关键字的时候,虚拟机要去方法区的常量池中寻找,是否能找到这个类的符号引用,如果没有找到,那么必须先执行类的加载过程、解析和初始化。对于继承而言,同样需要同时找到其父类(从下到上的顺序去查找)
 
2、分配内存并初始化零值
     类加载完成后就需要在Java堆中分配指定大小的内存,这个大小是在类加载完成后确定的。
     假设Java堆中的内存是绝对规整的,使用中的内存放一边,没使用的放在另一边,中间放着一个指针区分,那么在对象分配内存的时候,指针向空闲的那边挪动一段与类实例对象大小相同的区域,这种叫做指针碰撞。但是并非所有的GC算法在内存回收后都会把内存区域整理一遍,这个时候内存是零散的,这个时候就需要虚拟机去维护一个可用内存列表了,在分配内存的时候找出一块足够大的空间来分配。
     这里还需要注意的是,对象在分配内存的时候的原子性的问题:假设我一个对象正在分配内存,指针还没来得及确定距离,下一个对象就来分配,并使用指针原来的位置,这个时候就会出问题。
     解决这个问题的方案有两种:1.对对象内存的分配使用同步的方式处理,就是一个对象正在分配内存的时候,内存指针不允许其他对象分配使用,2.另外一种方法就是利用缓存,在每一个线程设置本地线程分配缓冲TLAB,在分配对象内存的时候,先在TLAB中分配,如果TLAB中的内存不够了,那么就再同步锁定,重新分配。
     内存分配完成后,类对象里面的属性都初始化为0,或者是Null。以保证对象实例字段在不赋值的情况下也能使用。
 
3、设置对象的对象头
     对象头中会存放,这个对象是哪个类的实例,如何才能得到类的元数据信息、对象的哈希值,GC年龄带信息等等。
 
4、对象初始化
     这个时候开始执行init方法,按照程序员的意愿把对象里面的属性进行合理的初始化,然后一个对象才完整的诞生。对于继承的对象,会从父类开始向下执行初始化,这个初始化,并不是对父类也创建对象,然后初始化哦。
 
 
 
 
 
 
 
 
 
 
0
3
分享到:
评论

相关推荐

    JVM 知识点整理:对象的创建过程

    这就意味着类已经被加载,创建对象时这步类加载就不要执行了 分配内存 在类的加载检查通过后,接下来虚拟机将为新生对象分配内存。对象所需内存大小在类加载完成后便可以完全确定。为对象分配空间的任

    高级开发jvm面试题和答案.pdf

    对象的创建过程; 对象在内存中的存储布局; 对象头markword具体有什么: 对象的怎么定位,怎么通过引用找到他,有两个方法; 对象分配内存空间过程; 对象的浅克隆和深克隆; 类加载 类加载过程(类加载从磁盘上将...

    JVM思维导图(包含所有JVM知识)

    JVM整体结构内存模型(对象的创建,指针压缩,对象大小,对象内存),垃圾收集器,垃圾收集器算法、内存调优(调优工具),垃圾收集,内存回收(算法),类加载机制(类加载过程,双亲委派),一图学完JVM所有的知识...

    java学习之JVM调优相关说明

    其实听着JVM调优这个词有些高大上,但是等你真正了解了他的内在原理后,还是很容易的。...减少使用全局变量、大对象以及减少创建对象的数量 通过代码解决GC情况比优化JVM参数更好 架构和代码调优等级优先于JVM优化

    深入理解java对象,包括对象创建和内存分配

    描述对象的创建过程,对象的内存布局,jvm指针压缩,对象访问

    resin-jvm 调优

    引用计数存储对特定对象的所有引用数,也就是说,当应用程序创建引用以及引用超出范围时,jvm必须适当增减引用数。当某对象的引用数为0时,便可以进行垃圾收集。 1.2.对象引用遍历 早期的jvm使用引用计数,现在...

    深入理解JVM内存结构及运行原理全套视频加资料.txt

    包括JVM执行过程、虚拟机类加载机制、运行时数据区、GC、类加载器、内存分配与回收策略等,全套视频加资料高清无密码  第1讲 说在前面的话 免费 00:05:07  第2讲 整个部分要讲的内容说明 免费 00:06:58  第3讲...

    dai147444612#JVM#HotSpot虚拟机对象探秘1

    对象的创建加载:先去检测new指令能否再常量池中定位到一个类的符号引用,如果未被加载、解析、初始化过 执行相应的类加载过程分配内存: 为对象分配空间时采用指针碰

    【JVM和性能优化】1.Java内存区域

    文章目录了解的必要性JVM历史JVM数据区域私有区共有区内存区域版本变化1.61.71.8元空间栈跟堆Java中的对象都是在堆中分配吗逃逸分析标量替换栈上分配同步消除JVM对象对象创建过程对象内存布局对象访问方式通过句柄...

    深入理解Java虚拟机视频教程(jvm性能调优+内存模型+虚拟机原理)视频教程

    第29节对象在内存中的布局-对象的创建00:21:19分钟 | 第30节探究对象的结构00:13:47分钟 | 第31节深入理解对象的访问定位00:08:01分钟 | 第32节垃圾回收-概述00:06:20分钟 | 第33节垃圾回收-判断对象是否存活...

    java8源码-jvm-study:jvm-study

    创建对象 堆空间分代划分 outOfMemory异常 https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html 可以看jvm参数查看网址 Direct buffer memory : 直接内存太大(-XX:MaxDirectMemorySize=100m) ...

    JVM大厂高频面试题,连这些都不知道,还敢说自己学过JVM?

    3. 对象创建方法,对象的内存分配,对象的访问定位。4. GC 的两种判定方法:5. SafePoint 是什么6. GC 的三种收集方法的原理与特点,分别用在什么地方?7. GC 收集器有哪些?CMS 收集器与 G1 收集器的特点。8. Minor...

    Java学习笔记

    类: 创建对象的模板 具有相同特征的一类 事物的高度抽象集合概念 对象是类的实例化,类是对象的抽象 化。 引用 4.动态更新 5.简单! 没有指针和相关的内存操作 new 内存操作 gc 内存回收清理 Java 中的回收机制: ...

    java8rt.jar源码-mini-jvm:Go语言实现的JVM,实现了部分字节码的解释执行,学习JVM使用

    简单对象(POJO)创建 基本类型数组和引用类型的数组创建、读写 字符串常量,即String name = "hello, 世界" main方法中可以读取到命令行参数 对象字段读写、静态字段读写 方法重载、方法重写、接口方法调用、形参全部...

    免费超全面的Java基础类型,容器,并发,IO流,面向对象,Web编程等代码总结

    线程的创建方式与生命周期 线程核心机制,基础概念扩展 多线程并发访问,同步控制 线程间通信,等待/通知机制 锁锁机制,API详解 Fork/Join 框架机制详解 Executor线程池框架简介 面向对象 泛型机制与反射原理 ...

    JVM面试专题

    8、Java对象创建过程 9、类的生命周期【加载过程】 10、Java 中会存在内存泄漏吗,请简单描述。 11、GC是什么?为什么要有GC? 12、做GC时,⼀个对象在内存各个Space中被移动的顺序是什么? 13、你知道哪些垃

    JVM讲解视频.zip

    JVM对象创建原理 分配内存过程 o指针碰撞 o空闲列表 oCAS oTLAB 分配位置 o逃逸分析 o标量替换 对象头结构详解 对象垃圾回收 对象内存回收方式 o引用计数法(基本不用) o可达性分析算法(主流使用) ...

    Java对象的序列化与反序列化

     在Java中,我们可以通过多种方式来创建对象,并且只要对象没有被回收我们都可以复用该对象。但是,我们创建出来的这些Java对象都是存在于JVM的堆内存中的。只有JVM处于运行状态的时候,这些对象才可能存在。一旦...

    轻松搞定jvm类加载器

    而**当我们需要用到某个类时,jvm将会加载它,并在内存中创建对应的class对象,这个过程称之为类的加载。**过程如下: 类的加载、连接、初始化 1. 加载 通过类的包名和雷鸣查找到此类的字节码文件,将xx.class文件...

    高级java开发并发问题

    虽然Java中万物皆对象,但是new Thread() 创建一个线程和 new Object()还是有区别的。 new Object()过程如下: 1.JVM分配一块内存 M 2.在内存 M 上初始化该对象 3.将内存 M 的地址赋值给引用变量 obj 创建线程的过程...

Global site tag (gtag.js) - Google Analytics