JVM基础知识总结:
- jvm内部结构:
堆内存的的结构:元空间逻辑上存在单是物理上不存在;
方法区:存储类信息、常量、静态变量。全局共享。
堆区:存放对象和数组。全局共享。
栈区:基本数据类型、对象的引用都存放在这。线程私有。 - 类加载器:
类加载器涉及到双亲委派机制:
双亲委派机制的作用: - 安全,可以避免用户自己编写的类动态替换java的核心 类,如java.lang.String
- 避免全限定名称的类重复加载(使用了findLoadClass()判断当前类是否已经加载)
- 流程图:
- App -->EXC(java扩展类)–>BOOT
- 类加载器收到类类加载的请求
- 将这个请求向上委托给父类加载器去完成,一直向上委托,直到启动类加载器
- 启动类加载器检查是否能够加载当前这个类,能够加载就结束,使用当前加载器,否则向下通知子类加载器
- 如果都无法加载则报错:class not found
3.对象的加载流程:
- 什么是垃圾:没有任何引用指向的一个或者多个对象(循环依赖)
- 如何定位垃圾:1.引用计数法 2.根可达算法:那些可以作为GC的roots (1)线程栈变量 (2)静态变量 (3)常量池 (4)jni指针 (5)类文件
- 常见的垃圾回收算法:
1.标记清除法——位置不连续 产生碎片
2.复制算法——没有碎片,但是浪费内存
3.标记压缩法——没有碎片,但是效率较低
**
*JVM内存分代模型:
1.部分垃圾回收器使用的模型
2.新生代+老年代+永久代(1.7) /元数据区(1.8)Metaspace
- 永久代 元数据-Class
- 永久代必须指定大小限制,元数据可以设置,也可以不设置,无上限(受限于物理内存)
- 字符串常量1.7 - 永久代, 1.8 - 堆
- Methorea(方法区)逻辑概念 - 永久代、元数据
3.新生代=Eden+2个suvivor区
1.YGC回收之后,大多数的对象会被回收不,活着的进入s0
2.再次YGC,活着的对象eden+s0 ——>s1
3.再次YGC,eden+s1 ——>s0
4.年龄足够——>老年代(15 CMS 6)(年龄的问题和具体的垃圾回收器有关)
5.s区装不下——>老年代
4.老年代
1.顽固分子
2.老年代满了 FGC FULL GC
5.GC Tuning
1.尽量减少FGC
垃圾回收器分类: