内存管理
- 讲义回顾:234重点
- 内存管理: 7和8的区别;
- 8多了本地内存:直接内存和元空间
- 7的方法区在永久代;8在元空间
- 年轻代什么时候进入老年代
- 默认阈值15代,放入老年代
- survivor装不下
- 默认1:2 , 8:1:1
- 方法区里面有什么
- 类信息
- 类型信息: 类名、付雷鸣、修饰符、接口列表
- 域信息: 成员变量的各种信息
- 方法信息
- 运行时常量池
- JIT代码缓存
- 类信息
- 常量池与运行时常量池
- 常量池:存放编译期间生成的各种字面量与符号引用
- 运行时常量池:产量池在运行时的表现形式(8以后放在堆里)
- 关系:变异后的字节码文件中包含了类型信息、域信息、方法信息。将字节码中的信息加载到运行时常量池
- 直接内存
- JVM之外
- 场景:
- 改善堆郭达时垃圾回收效率,减少停顿。FUll GC会扫描堆内存。存在本地,由草祖宗系统处理
- 减少拷贝损耗问题。减少内存在Native对和JVM堆拷贝过程,避免拷贝损耗,降低内存使用
- 可突破JVM内存大小的限制
JVM加载机制
- 类加载子系统
- 加载、连接(验证、准备、解析)、初始化、使用、卸载
- 加载
- 预加载、JVM自己启动时候需要加载的
- 运行时加载
- 初始化
:类的初始化阶段 : 对象的初始化阶段
- 类加载
- 启动(引导)类加载器BootStrapClassLoader
- c/c++, 嵌套在jvmneibu
- 用于JVM自身需要的类
- 并不继承ClassLoader,没有父加载器
- 扩展类加载器ExtensionClassLoader
- 父类是启动类加载器
- java编写
- 系统类加载器SystemClassLoader
- 父类为扩展类加载器
- 通过ClassLoader#getSystemClassLoader()方法可以获得
- 启动(引导)类加载器BootStrapClassLoader
双亲委派机制
JVM调优指调优GC,或者内存溢出出问题
- 判断对象是否死亡算法
- 引用计数算法(不用)
- 循环引用问题
- 可达性分析算法
- 不可达的【可能】是垃圾;先标记一下
- 后面放在一个回收队列中,调用finalize方法,如果还不行,才回收
- 引用计数算法(不用)
- GC Root
- 方法区的对象
- 虚拟机栈的局部变量表
- 本地方法栈的对象
- 垃圾收集算法
- 分带收集理论

- 标记清除算法
- 标记复制算法
- 标记整理算法
- 垃圾回收器


CMS回收器: 相当于老年代的回收器,JDK14取消掉了
- CMS如果出问题,可以和Serial OldGC组合
- 图中实线为可以组合的方案;虚线为不建议的组合
- ParNew和Parallel区别?
- GC的安全点和安全域
- stop the world必须在安全点和安全域的时候
- 安全点为:方法返回结束,或者周期结束
- Serial
- 使用方式: -XX:+UseSerialGC 相当于配置两个GC回收器
- 会 stop the world
- 新生代复制算法;老年代整理算法
- ParNew
- Serial GC的多线程版本
- 会stop the world
- -XX:+UseParNewGC
- 只作用年轻代
- 与CMS组合,一个回收年轻,一个回收老年
- Parallel
- 年轻代; 复制算法
- 吞吐量优先
- 吞吐量= 用户应用执行时间 / (停顿时间 + 用户应用执行时间)
- Parallel Old
- 吞吐量= 用户应用执行时间 / (停顿时间 + 用户应用执行时间)
- 与Parallel类似
- 老年代;吞吐量; 整理算法
- CMS
- 最短停顿时间
- 因为并行,所以用户不会卡顿
- 由于程序运行,所以可能重新标记。
- 并发清理、重置线程

- G1


蓝色表示巨大的对象humongous
- 常用命令







- 常用工具
- jconsole 监控管理工具
- java bin下有exe文件
- VIrtualVM 可视化优化工具
- java bin下有exe文件
- jconsole 监控管理工具
- GC日志分析
- GC日志分析工具
- 在线: https://gceasy.io/index.jsp
- GCViewer是一个小工具,可以可视化展示。支持Sun/Oracle,IBM,HP和Bea的JAVA虚拟机
