JVM学习笔记

167 阅读3分钟

类加载机制

image.png

image.png

image.png 优先加载层级高的

装载:

  1. 字节码文件--->字节流--->类加载器(classLoading);
  2. 将字节流代表的静态存储结构转化为方法区的运行时数据结构;
  3. Java堆里面生成一个代表这个类的JAVA.lang.Class对象,作为我们数据访问入口;

链接:

  1. 验证文件不能有问题;
  2. 为类的静态变量分配内存;
  3. 符号引用转换为直接引用;(符号引用:仅仅是字面量,没有在JVM开辟地址)

初始化

  1. 给静态变量赋值
  2. 分层进行类加载 计算对象的大小

使用

卸载

运行时数据区image.png 方法区和堆是线程共享的;另外三个是线程私有的;

  • 方法区:类信息、静态变量、常量、即时编译器编译之后的代码
  • 虚拟机栈:
  • 本地方法栈:
  • 堆:
  • 程序计数器: 栈帧 :所有方法的执行一定是在栈帧当中 image.png Java对象内存布局: image.png

image.png

申请内存流程image.png

我们回收哪一块区域?

如何判断我们的对象是垃圾?

  • 引用计数法:一个对象被引用了一次,在当前的对象头上递增一次引用次数,如果这个对象的引用次数为0,代表这个对象可回收。当对象间出现了循环引用的话,则引用计数法就会失效。Java不用这个方法。
  • 可达性分析算法: XXX GC ROOT (栈帧的局部变量表的元素,本地方法栈JNI里面的元素,方法区静态变量与常量可以看作GC ROOT)

垃圾回收算法😘

  • 标记清除算法:让业务线程停一下(STW)
  • 复制算法:内存使用率不高,,,适用于周期短的新生代
  • 标记整理算法:适用于标记整理
  • 分代收集算法:
  • 分治算法:

垃圾收集器

image.png

  • 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

链接