JVM内存模型和类加载机制

JVM内存模型

一、JVM内存模型

https://www.liangzl.com/get-article-detail-121504.html

方法区(Method Area):

方法区主要用来存储 类信息、静态变量、常量池、JIT编译后的代码等数据。

堆(Heap):

几乎所有的对象(数组、类的实例等)都是在此分配内存的。在JVM内存中占的比例极大,也是GC垃圾回收的主要阵地,平时我们说的什么新生代、老年代、永久代也是指的这个片区域。

虚拟机栈(Java Stack):

当JVM在执行方法时,会在此区域中创建一个栈帧来存放方法的各种信息,比如***返回值,局部变量和各种对象引用***等,方法开始执行前就先创建栈帧入栈,执行完后就出栈。

本地方法栈(Native Method Stack):

和虚拟机类似,不过区别是专门提供给Native方法用的。

程序计数器(Program Counter Register):

占用很小的一片区域,我们知道JVM执行代码是一行一行执行字节码,所以需要一个计数器记录当前执行的行数。

二、为什么进行分代?

1、java虚拟机根据对象存活的周期不同,将堆内存分为:

新生代(伊甸、幸存1、幸存2)[8:1:1]、老年代、永久代。

2、为什么进行分代?

给堆内存分代是为了提高对象内存分配和垃圾回收的效率。

新创建的对象会在新生代中分配内存;经过多次回收任然活下来的对象存放在老年代中;静态属性、类信息等存放在永久代中。

根据不同年代的特点采用合适的垃圾收集算法。

新生代和老年代是垃圾回收的主要区域。

三、类加载机制

虚拟机将描述类的数据从Class文件记载到内存,并对数据进行校验、转化解析和初始化,最终形成可以被虚拟机直接使用的java类型。类加载和连接的过程都是在运行期间完成的。

1、类的加载方式:

1)、本地编译好的class中直接加载

2)、网络加载:java.net.URLClassLoader可以加载url指定的类

3)、从jar等压缩文件中加载类,自动解析jar文件到class文件去加载util类

4)、从 java源代码文件动态编译成class文件

2、类(加载)的生命周期
1)、类加载的生命周期:(过程)

加载过程主要做了哪三件事?

(1)、通过类的全限定名来获取定义此类的二进制字节流。

(2)、将这个类字节流代表的静态存储结构转为方法区的运行时数据结构

(3)、在堆中生成一个代表此类的java.lang.Class对象,作为访问方法区这些数据结构的入口。

2)、双亲委派机制

如果一个类加载器收到了类加载器的请求。首先不会自己去尝试加载这个类,而是把这个请求委派给父加载器去完成。只有父加载反馈自己无法加载这个请求,子加载器才会尝试自己去加载。

是把这个请求委派给父加载器去完成。只有父加载反馈自己无法加载这个请求,子加载器才会尝试自己去加载。

经验分享 程序员 微信小程序 职场和发展