本文共 1212 字,大约阅读时间需要 4 分钟。
https://www.liangzl.com/get-article-detail-121504.html
方法区主要用来存储 类信息、静态变量、常量池、JIT编译后的代码等数据。
几乎所有的对象(数组、类的实例等)都是在此分配内存的。在JVM内存中占的比例极大,也是GC垃圾回收的主要阵地,平时我们说的什么新生代、老年代、永久代也是指的这个片区域。
当JVM在执行方法时,会在此区域中创建一个栈帧来存放方法的各种信息,比如***返回值,局部变量和各种对象引用***等,方法开始执行前就先创建栈帧入栈,执行完后就出栈。
和虚拟机类似,不过区别是专门提供给Native方法用的。
占用很小的一片区域,我们知道JVM执行代码是一行一行执行字节码,所以需要一个计数器记录当前执行的行数。
新生代(伊甸、幸存1、幸存2)[8:1:1]、老年代、永久代。
给堆内存分代是为了提高对象内存分配和垃圾回收的效率。
新创建的对象会在新生代中分配内存;经过多次回收任然活下来的对象存放在老年代中;静态属性、类信息等存放在永久代中。
根据不同年代的特点采用合适的垃圾收集算法。
新生代和老年代是垃圾回收的主要区域。
虚拟机将描述类的数据从Class文件记载到内存,并对数据进行校验、转化解析和初始化,最终形成可以被虚拟机直接使用的java类型。类加载和连接的过程都是在运行期间完成的。
1)、本地编译好的class中直接加载
2)、网络加载:java.net.URLClassLoader可以加载url指定的类
3)、从jar等压缩文件中加载类,自动解析jar文件到class文件去加载util类
4)、从 java源代码文件动态编译成class文件
加载过程主要做了哪三件事?
(1)、通过类的全限定名来获取定义此类的二进制字节流。
(2)、将这个类字节流代表的静态存储结构转为方法区的运行时数据结构
(3)、在堆中生成一个代表此类的java.lang.Class对象,作为访问方法区这些数据结构的入口。
如果一个类加载器收到了类加载器的请求。首先不会自己去尝试加载这个类,而是把这个请求委派给父加载器去完成。只有父加载反馈自己无法加载这个请求,子加载器才会尝试自己去加载。
是把这个请求委派给父加载器去完成。只有父加载反馈自己无法加载这个请求,子加载器才会尝试自己去加载。
转载地址:http://rugpb.baihongyu.com/