博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JVM内存模型和类加载机制
阅读量:2339 次
发布时间:2019-05-10

本文共 1212 字,大约阅读时间需要 4 分钟。

JVM内存模型

一、JVM内存模型

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

img

方法区(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)、类加载的生命周期:(过程)

img

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

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

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

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

2)、双亲委派机制

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

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

转载地址:http://rugpb.baihongyu.com/

你可能感兴趣的文章
【深入理解JVM虚拟机】第3章 垃圾收集器与内存分配策略
查看>>
性能优化-jvm
查看>>
性能优化-mysql
查看>>
性能优化-tomcat
查看>>
JVM内存模型、指令重排、内存屏障概念解析
查看>>
【java基础】集合框架总结
查看>>
Elasticsearch-基础介绍及索引原理分析
查看>>
【深入理解JVM虚拟机】第7章 虚拟机类的加载机制
查看>>
【C++】二、指针数组与数组指针
查看>>
【C++】三、const与字符串
查看>>
【C++】四、重载,重写,重定义
查看>>
【C++】五、拷贝构造与赋值构造
查看>>
【C++】六、继承与多态
查看>>
特征向量的欧式距离与余弦距离——推荐算法
查看>>
cJSON源码分析3-核心解析算法
查看>>
如何正确使用C中的可变参数
查看>>
SDL2.0-简介
查看>>
SDL2.0-播放YUV文件
查看>>
leetcode 1.TwoSum--hashmap
查看>>
leetcode 14. Longest Common Prefix
查看>>