jvm对象创建以及类的加载

原创 2015年07月08日 22:08:29

当虚拟机遇到一个new命令时,首先将会检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已经被加载,解析和初始化过。如果没有就必须先执行类加载过程。

类从被加载到虚拟机到被卸载。生命周期:加载,验证,准备,解析,初始化,使用和卸载。

在什么情况下需要加载类呢?

1.遇到new,getstatic,putstatic或invokestatic指令时。常见场景是使用new关键字实例化对象的时候,读取或设置一个类的静态字段(被final修饰,已在编译期把结果放入常量池的静态字段除外)的时候,一起调用一个类的静态方法的时候。

2.使用java.lang.reflect反射。如果类没有进行过初始化则先初始化。

3.当初始化一个类时,如果其父类还没有初始化,则先触发其父类初始化。

4.当虚拟机启动时,虚拟机需先执行一个指定的之类(public main方法),这个类先初始化。

5.jdk1.7版本的java.lang.invoke.MethodHandle.

在类加载检查通过后,接下来虚拟机将为新生对象分配内存。对象所需内存将会被划分出来。

如果java堆时规整的。所有用过的内存在一边,空闲的内存在另一边。中间放着一个指针,分配内存就只是将指针往空闲方向挪动一个与对象大小相等的距离。这种分配内存的方法,称为指针碰撞。

如果java堆不规整。虚拟机就维持一个列表,记录那些内存是可用的,哪些是不可用的。在分配时,从列表中找到一块足够大的空间划分给对象实例,并更新列表上的记录。这种方式叫做空闲列表。选择哪种分配方式,由java堆是否规整觉定,而java堆是否规整,又由所采用的垃圾回收器是否带有垃圾压缩整理功能决定。

内存分配完成后,虚拟机要对对象进行必要的设置,如,这个对象是哪个类的实例,如何才能找到类的元信息,对象的哈希吗,对象的GC分代年龄等。这些都在对象头(Object Header)中。

以上工作都完成了,从虚拟机角度看,一个新的对象已经产生,但是java程序的角度看,还要进行init,所有字段还为零。把对象按照程序员的意愿进行初始化,一个真正可用的对象才算产生了。

JVM 如何创建Java对象

在Java程序中,创建一个对象通常需要一个new关键字就够了,但是在虚拟机中,这个过程却有点复杂,这里面包括了类加载、内存分配、初始化零值等等一系列的步骤。 下面来看看JVM如何创建一个对象(这里面...
  • u010723709
  • u010723709
  • 2015年08月04日 20:38
  • 1393

深入理解JVM : Java堆中对象创建、布局、访问全过程

一、对象的创建new Animal();1.类加载检查:检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,那必须先执行相应的...
  • sc313121000
  • sc313121000
  • 2016年03月07日 15:32
  • 1171

jvm如何判断对象是否可以被回收

内容基本来自周志明 深入理解java虚拟机 第二版 第三章 。这本书还可以,不过好像也没什么其他中文的关于jvm比较好的书了 jvm要做垃圾回收时,首先要判断一个对象是否还有可能被使用。那么如何判...
  • u012941811
  • u012941811
  • 2016年09月04日 01:22
  • 2400

【JVM类加载机制】从一个对象的验证问题说开去

0 引例前几天本人正在愉快的写代码的时候突然接到老大给的一个新任务,对支付相关的几个类做代码加密和安全性校验工作,确保类来源的安全性。 那么现在有了需求下一步就要来满足需求,这里采用的方案是在加载过...
  • zxzy17
  • zxzy17
  • 2016年01月25日 00:16
  • 526

JVM加载对象时内存加载顺序

在开发中,有时会遇到这样的情况:我明明给一个变量赋值了,为什么在使用该变量时却是没有值的,这个和JVM的内存加载顺序有关,当你使用该变量时,这个变量还没初始化完成。 首先我们来看一段代码:publi...
  • mazhen1991
  • mazhen1991
  • 2017年07月29日 10:01
  • 103

5分钟掌握jvm 类的加载机制

类的加载分为以下几个阶段 加载->验证->准备->解析->初始化->使用->卸载            |         链接阶段     |            ----------------...
  • chenaima1314
  • chenaima1314
  • 2018年01月07日 21:13
  • 12

JVM类加载机制以及类缓存问题的处理

JVM类加载机制以及类缓存问题的处理  当一个java项目启动的时候,JVM会找到main方法,根据对象之间的调用来对class文件和所引用的jar包中的class文件进行加载(其步骤分为加载、验证、...
  • weixin_41235247
  • weixin_41235247
  • 2018年01月02日 14:40
  • 21

jvm系列(一):java类的加载机制

java类的加载机制   1、什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象...
  • andyzhaojianhui
  • andyzhaojianhui
  • 2017年07月23日 15:33
  • 107

Java虚拟机详细解析--JVM类加载过程+内存分配+GC算法+垃圾回收器分类

一、 JVM的类加载过程          1、类的加载 (1)通过一个类的全限定名获取此类的Class文件。而获取的方式,可以通过jar包、war包、网络中获取、JSP文件生成等方式。 (2)Cla...
  • wyz_2017
  • wyz_2017
  • 2017年12月08日 16:51
  • 45

JVM(1):Java 类的加载机制

1、什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在...
  • lin443514407lin
  • lin443514407lin
  • 2017年03月14日 12:59
  • 208
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:jvm对象创建以及类的加载
举报原因:
原因补充:

(最多只允许输入30个字)