微软|一文详解JVM垃圾收集机制,10张图帮你轻松搞定大厂面试难点


微软|一文详解JVM垃圾收集机制,10张图帮你轻松搞定大厂面试难点
文章图片
微软|一文详解JVM垃圾收集机制,10张图帮你轻松搞定大厂面试难点
文章图片
微软|一文详解JVM垃圾收集机制,10张图帮你轻松搞定大厂面试难点
文章图片
微软|一文详解JVM垃圾收集机制,10张图帮你轻松搞定大厂面试难点
文章图片
微软|一文详解JVM垃圾收集机制,10张图帮你轻松搞定大厂面试难点
文章图片
微软|一文详解JVM垃圾收集机制,10张图帮你轻松搞定大厂面试难点
文章图片
微软|一文详解JVM垃圾收集机制,10张图帮你轻松搞定大厂面试难点
文章图片
微软|一文详解JVM垃圾收集机制,10张图帮你轻松搞定大厂面试难点
文章图片
微软|一文详解JVM垃圾收集机制,10张图帮你轻松搞定大厂面试难点
文章图片
微软|一文详解JVM垃圾收集机制,10张图帮你轻松搞定大厂面试难点
文章图片
今日分享开始啦 , 请大家多多指教~
类加载子系统classLoader 只负责对字节码文件的加载 , 至于是否可以运行 , 还要看执行引擎 。
加载的类信息存放于方法区的内存空间 , 除了类信息之外 , 还会存放有运行时常量池的信息 , 还可能包含字符串字面量和数字常量 。
loading加载:
通过一个类的全限定名获得定义此类的二进制字节流 。 也就是根据完整的路径找到对应类的二进制字节流 。
将这个字节流所代表的静态的数据结构转化为方法区运行时的数据结构 。
在内存中生成一个代表这个类的Java.lang.Class对象 , 作为方法区这个方法数据的入口 。
【微软|一文详解JVM垃圾收集机制,10张图帮你轻松搞定大厂面试难点】链接:
验证、准备、解析
验证:目的在于确保二进制字节流包含的信息符合虚拟机的要求 , 保证被加载类的正确性 , 不会危害虚拟机的安全 。
验证文件格式、字节码、元数据、符号引用的验证 。
准备:为类变量分配内存并设置默认的初始值 , 即零值 。
不包含被final修饰的类变量 。
解析:将常量池的符号转化为直接引用的过程 。
初始化:JVM将程序的执行权交给程序 。
双亲委派模型双亲委派模型的原理:如果一个类加载器收到了类加载的请求的话 , 它首先不会自己去尝试加载这个类 , 而是把这个请求委派给自己的父类加载器去完成 , 每一层的加载器都是如此 , 因此所有的加载请求都会传送到最顶层的启动类加载器中 , 只有当父类加载器反馈自己无法加载这个请求的时候 , 即父类搜索不到这个类的时候 , 子类才会自己尝试去加载 。
使用双亲委派模型来组织类加载之间的关系 , 一个显而易见的好处就是Java中类随着它的类加载器一起具备了一种带有优先级的层级关系 。 因此Object类在程序中的各种类加载的环境中都能保证是同一个类 。 反之 , 如果没有双亲委派模型的话 , 都由各个的类加载器去加载的话 , 如果用户自定义了一个java.lang.Object的类 , 并放在ClassPath 中的话 , 就会出现多个Object类 , Java中最基础的体系也就会无法保证 。
破坏双亲委派模型:
1.双亲委派模型被破坏的第一次就是刚引入双亲委派模型的时候 , 是为了兼容JDK1.2之前的代码 。
2.双亲委派模型的第二次的破坏就是自身的缺陷导致的 , 当发生父类调用子类的时候 。
3.第三次就是用户对于程序动态性的追求而导致的:代码热的替换、模块热的部署 。
垃圾回收什么是垃圾?
GC 中的垃圾就是特指在内存中的、不会再被使用的对象 。
判断对象已死引用计数器法:
每个对象添加一个引用计数器 , 每被引用一次 , 计数器加1 , 失去引用 , 计数器减1 , 当计数器在一段时间内保持为0时 , 该对象就认为是可以被回收得了 。 (在JDK1.2之前 , 使用的是该算法)
缺点:当两个对象A、B相互引用的时候 , 当其他所有的引用都消失之后 , A和B还有一个相互引用 , 此时计数器各为1 , 而实际上这两个对象都已经没有额外的引用了 , 已经是垃圾了 。 但是却不会被回收 , 引用计数器法不能解决循环引用的问题 。