jvm知识整理
类加载器
BootstrapClassLoader【启动类加载器】
ExtClassLoader【标准扩展类加载器】
ApplicationClassLoader【系统类加载器】
CustomClassLoader【用户自定义类加载器】
当一个类加载某个类.class 的时候,不会直接去加载
而是用户自定义类加载器
委托系统类加载器
委托标准扩展类加载器
委托启动类加载器
去加载
如果启动类加载器
不加载这个,就交给标准扩展类加载器
,标准扩展类加载器
不负责加载这个就系统类加载器
,一层层的下去,然后最终加载到这个.class 类。
作用:保护 java 的核心类
- 通过委托的方式,保证核心.class 不被篡改。可避免用户自己编写的类动态替换 Java 的核心类。
- 防止加载同一个.class。避免全限定命名的类重复加载
JVM 的内存结构
1、五大区域
- 方法区:类加载器加载的类就放到方法区【该区归所有线程共享】
- 堆内存: 实例变量存在堆内存中【该区归所有线程共享】
- 栈内存:后进先出,对于栈来说不存在垃圾回收问题,只要线程一结束该栈就 Over【是线程私有的】
- 本地方法栈:内存中的一块区域负责登记
native
方法【归所有线程共享】 - 程序计数器:记录程序运行的位置和下一个方法的位置
2、堆
2.1、新生代
新生代主要用来存放新生的对象。一般占据堆空间的 1/3。
新生代的区域划分: 三块区域Eden 区、SurvivorFrom、ServivorTo 区
默认的空间占比: 8:1:1
新生代采用的是:复制算法
2.2、老年代
由新生代晋升而来的:
- 新生代经过垃圾回收后,年级+1,默认是 15 岁以后进入老年代
- 新生代区域放不下某个变量的时候,同时触发新生代的垃圾回收依然放不下,进入老年代
2.3、元空间
永久代在 Java8 中已经被移除,元空间与永久代之间最大的区别在于:元空间使用本地内存,而永久代使用的是 JVM 的内存。因此,默认情况下,元空间的大小仅受本地内存的限制。
类的元数据放入本地内存(native memory),字符串池和类的静态变量放入 java 堆中。这样可以加载多少类的元数据就不再由 MaxPermSize 控制,而由系统的实际可用空间来控制。
3、垃圾回收器
- Serial old 和 Serial:单线程垃圾回收器
- Parallel old 和 Parallel new:多线程垃圾回收器
- CMS:并发进行的标记清除算法的垃圾回收器
- G1:类似于 CMS 的垃圾回收器,但是进行垃圾回收的时间预测
本文采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 ShiGuang
评论