类加载机制
优先加载层级高的
装载:
- 字节码文件--->字节流--->类加载器(classLoading);
- 将字节流代表的静态存储结构转化为方法区的运行时数据结构;
- Java堆里面生成一个代表这个类的JAVA.lang.Class对象,作为我们数据访问入口;
链接:
- 验证文件不能有问题;
- 为类的静态变量分配内存;
- 符号引用转换为直接引用;(符号引用:仅仅是字面量,没有在JVM开辟地址)
初始化
- 给静态变量赋值
- 分层进行类加载 计算对象的大小
使用
卸载
运行时数据区:
方法区和堆是线程共享的;另外三个是线程私有的;
- 方法区:类信息、静态变量、常量、即时编译器编译之后的代码
- 虚拟机栈:
- 本地方法栈:
- 堆:
- 程序计数器:
栈帧 :所有方法的执行一定是在栈帧当中
Java对象内存布局:
申请内存流程:
我们回收哪一块区域?
如何判断我们的对象是垃圾?
- 引用计数法:一个对象被引用了一次,在当前的对象头上递增一次引用次数,如果这个对象的引用次数为0,代表这个对象可回收。当对象间出现了循环引用的话,则引用计数法就会失效。Java不用这个方法。
- 可达性分析算法: XXX GC ROOT (栈帧的局部变量表的元素,本地方法栈JNI里面的元素,方法区静态变量与常量可以看作GC ROOT)
垃圾回收算法😘
- 标记清除算法:让业务线程停一下(STW)
- 复制算法:内存使用率不高,,,适用于周期短的新生代
- 标记整理算法:适用于标记整理
- 分代收集算法:
- 分治算法:
垃圾收集器
- serial JDK1.3之前 新生代 唯一的垃圾回收器 单线程 简单高效
- serial Old 老年代 单线程 标记-整理
- ParNew 多线程版本 CPU多核 新生代 复制算法
- Parallel Scavenge 并行多线程 新生代收集器 复制算法 系统吞吐量
- Parallel Old 老年代版本 多线程 标记整理算法 系统吞吐量
- 并发类垃圾收集器
- CMS垃圾收集器 分治思想 缺点:1.并发的阶段 4核一下不建议用 切时间片影响效率 2.标记-清除 产生内存碎片 影响停顿时间 3.有可能产生并发失败
- G1 JDK1.7出现 CMS的停顿时间变得更短,开发者自由设置;解决空间碎片。 1.8推荐 1.9默认 要求堆内存6G以上。使用的3个要求:1Java堆存活数据被占用到50%以上。2对象晋升变化速度大。3垃圾收集时间非常的长(0.5S--1S)。
- ZGC JDK11及其以上才能使用
相关参数:
标准参数:不随着JDK版本变化的
-X参数:非标准参数 -XX参数:非标准参数
- 布尔类型
- name=value
- 其他参数(简写) -Xms100M:初始化Heap大小 -Xmx100M:最大Heap大小 -Xss128:ThreadStackSize