5) 2021-11-18 学习记录,以面试回答口吻记录,拒绝八股 Jvm,Java内存结构,类加载机制,类加载的过程,垃圾回收机制

****## 一.Java内存结构
1.程序计数器: 线程私有,java栈帧存储当前方法执行的字节码行号的指示器
2.java虚拟机栈:线程私有,他的生命周期和线程一样,从方法调用到方法执行结束,对应了一个栈帧从入栈到出栈的的过程
3.本地方法栈:类似于Java虚拟机栈为Java方法服务,本地方法栈为native方法服务
4.Java堆:线程共享Java堆是JVM内存呢管理内存最大的一个区域,存放对象实例
5.方法区:各个线程共享的区域,存放被虚拟机加载的类信息,构造方法和接口定义,常量静态变量以及编译后的字节码等数据
6.运行时常量池:方法区的一部分,存放编译期生成的字面量和字符引用放在堆中

二.类加载机制

首先类加载器有 Application ClassLoder Extension ClassLoader BootStrap ClassLoader
当一个类收到的类加载的请求,首先他不会自己先尝试加载这个类,他会委托他的父类加载器去完成,每一层都是一样,然后到最上层BootStrap Class loader 查找没有这个类在往下查找,如果一直是查找没有的话就会报 ClassNotFoundException
优点:例如 自己重写了一个String类,类加载器不会先加载自己写的,会委派去查找,加载java的String类。

三.类加载的过程

加载,验证,准备,解析,初始化
加载:通过类的全限定名来获取定义此类的二进制字节流,在内存生成一个可以定义这个类的Class对象
验证:确保Class文件符合java虚拟机的要求,不会危害虚拟机的安全,例如开头是0xCAFFEBABE
准备:为静态变量分配内存并设置静态初始值
解析:将常量池中的符号引用替换成直接引用
初始化:执行Java 代码,静态代码块先执行

四.垃圾回收机制

1.什么时候触发
触发 Young GC:Eden区没有空间分配内存会触发young gc
触发 Full GC: Young GC平均晋升大小比老年代剩余的空间大,触发Full GC
永久代分配空间,没有足够内存,也会触发一次
System.gc()默认也是触发一次GC
CMS GC时出现 concurrent mode failure 也会触发一次
2.分代
分为新生代和老年代
新生代占3/1堆内存,又分为 Eden区,from suvorior .to suvorior 比例 8:1:1可用的是 9/10区域
新生代用 复制算法 ,不存在内存碎片只是费空间
老年代用标记清除算法和标记整理算法,标记清除有磁盘碎片,容易再次触发垃圾回收,标记整理涉及到有用对象移动到另一块内存,在回收剩下的无用对象。
引用计数算法,可达性分析法
①引用计数算法:
给对象加了一个引用计数器,每被调用一次就会计数加一,引用失效的时候计数减一,计数为0就会被回收,例如栈中的栈帧指向了一个对象,计数器就加一,栈帧指向null的时候,计数就减一。这样看着虽然简单高效,但是在遇到嵌套调用的时候或者有两个对象相互指向,只要调用就会加一,引用不会失效也就不会被识别回收。
②所以就引出了,可达性分析法:
定义一个名为GC Root对象作为起点,可以是多个,从节点向下搜寻,搜寻所有走过的路径,也就是引用链,当一个对象到GC Root没有任何引用链相连时,证明对象是不可用的,即可进行垃圾回收。
GC Root对象一般有:(当前时刻存活的对象,可记为不在堆的对象)
1.虚拟机栈(栈中的线程变量表)中引用的对象
2.方法区中静态属性引用的对象
3,方法区中常量引用的对象
4,本地方法栈里面JNI(Native)引用的对象
**

Guess you like

Origin blog.csdn.net/qq_45095838/article/details/121422391