JVM的类加载机制和运行过程

一、加载机制

JVM的类加载机制和运行过程加载:指的就是将class文件加载到内存中,并将这些静态数据转换成方法区中的运行时数据结构,在堆中生成一个java.lang.Class对象。

验证:要确保加载的信息符合jvm的规范,没有安全问题。

准备:指给类变量分配内存,并设置初始值得阶段,这些内存都将在方法区中分配。

解析:虚拟机常量池的符号引用替换为字节应用的过程。

初始化:初始化是执行clinit方法的过程。

整个类的加载完成之后将在运行区做一些操作。

二、jvm运行时数据区结构图

JVM的类加载机制和运行过程

java栈:存放的是一个个栈帧,每一个栈帧对应一个被调用的方法。

堆:堆是用来存储对象本身的以及数组(数组引用是存放在Java栈中的)。堆是被所有线程共享的,在JVM中只有一个堆。

本地方法栈:本地方法栈与Java栈的作用和原理非常相似。区别只不过是Java栈是为执行Java方法服务的,而本地方法栈则是为执行本地方法(Native Method)服务的。

程序计数器:程序计数器(Program Counter Register)是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的行号指示器。

方法区:与堆一样,是被线程共享的区域。在方法区中,存储了每个类的信息(包括类的名称、方法信息、字段信息)、静态变量、常量以及编译器编译后的代码等。

下面我们主要看下jvm 堆区域的结构:(jdk7)

JVM的类加载机制和运行过程

1.young gen 表示年轻代:年轻代分为eden区和s0/s1(采用标记复制算法)

新的对象实例被创建的时候通常在Eden空间,发生在Eden空间上的GC称为Minor GC,当在新生代发生一次GC后,会将Eden和其中一个Survivor空间的内存复制到另外一个Survivor中,如果反复几次有对象一直存活,此时内存对象将会被移至老年代。可以看到新生代中Eden占了大部分,而两个Survivor实际上占了很小一部分。这是因为大部分的对象被创建过后很快就会被GC

2.old memory表示老年代:(采用标记清除算法)

老年代里面的对象几乎每个都是在 Survivor 区域中熬过来的,它们是不会那么容易就 “死掉” 了的。因此,Full GC 发生的次数不会有 Minor GC 那么频繁,并且做一次 Full GC 要比进行一次 Minor GC 的时间更长。 另外,标记-清除算法收集垃圾的时候会产生许多的内存碎片 ( 即不连续的内存空间 ),此后需要为较大的对象分配内存空间时,若无法找到足够的连续的内存空间,就会提前触发一次 GC 的收集动作。

3.PermGen表示永久代:其实我们的方法区就可以认为是永久代。

JVM参数说明:

JVM的类加载机制和运行过程