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,所有字段还为零。把对象按照程序员的意愿进行初始化,一个真正可用的对象才算产生了。

相关文章推荐

java中new一个对象的时候JVM都做了哪些事

new 一个对象的时候JVM都做了哪些事情: 一、之前没有进行类加载 1、 类加载,同时初始化类中静态的属性(赋默认值) 2、执行静态代码块 3、分配内存空间,同时初始化非静态的属性(赋默认...
  • Q_X_X
  • Q_X_X
  • 2016年10月04日 14:31
  • 1388

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

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

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

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

【java】JVM结构和类的加载原理

Java语言中,类只有被加载到JVM中才能运行,当运行指定的java程序时,JVM会将编译生成的 .class文件按照一定的规则加载到内存中,并组织成为一个完整的应用程序。类的加载过程是由类加载器完成...

jvm(二)类的加载,连接,初始化详解

3.类的主动使用与被动使用 3.1 主动使用:包括以下6种情况: 3.1.1 创建类的示例(new A()) 3.1.2 访问类或接口的静态变量(或者对静态变量赋值,如:A.num, A.num = ...
  • qwkxq
  • qwkxq
  • 2017年02月19日 20:05
  • 391

JVM(四) 类的加载

What? 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构,...

jvm(一)类的加载,连接,初始化简介

1.类的加载会经过以下3个步骤: 1.加载:查找并加载类的二进制文件(class文件) 即: 将class文件中的二进制字节码数据从硬盘加载到内存, 并将数据存放在运行时数据区的方法区中, 然后在堆区...
  • qwkxq
  • qwkxq
  • 2017年02月19日 18:56
  • 457

JVM-类的加载

类的加载步骤JVM加载类的过程大致分为三步,装载(Load),连接(Link),初始化(Initialize) 装载:加载类的二进制文件(将.class加载如内存)通过一个类的全限定名来获取定义此类的...

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

1、什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结...

JVM源码分析之Java类的加载过程

HotSpot内存划分在HotSpot实现中,内存被划分成Java堆、方法区、Java栈、本地方法栈和PC寄存器几个部分:1、Java栈和本地方法栈用于方法之间的调用,进栈出栈的过程;2、Java堆用...
  • undoner
  • undoner
  • 2017年03月22日 10:07
  • 413
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:jvm对象创建以及类的加载
举报原因:
原因补充:

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