【JVM】关于JVM,你需要掌握这些 | 一文彻底吃透JVM系列( 二 )


作用:存放对象实例 。垃圾收集器主要管理的就是 Java 堆 。Java 堆在物理上可以不连续 , 只要逻辑上连续即可 。
方法区(线程共享)方法区(Method Area)被所有线程共享 , 用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据 。
和 Java 堆一样 , 不需要连续的内存 , 可以选择固定的大小 , 更可以选择不实现垃圾收集 。
运行时常量池运行时常量池(Runtime Constant Pool)是方法区的一部分 。保存 Class 文件中的符号引用、翻译出来的直接引用 。运行时常量池可以在运行期间将新的常量放入池中 。
Java 中对象访问是如何进行的?Object obj =newObject();对于上述最简单的访问 , 也会涉及到 Java 栈、Java 堆、方法区这三个最重要内存区域 。
Object obj如果出现在方法体中 , 则上述代码会反映到 Java 栈的本地变量表中 , 作为 reference 类型数据出现 。
newObject()反映到 Java 堆中 , 形成一块存储了 Object 类型所有对象实例数据值的内存 。Java堆中还包含对象类型数据的地址信息 , 这些类型数据存储在方法区中 。
如何判断对象是否“死去”?

  1. 引用计数法
  2. 根搜索算法
什么是引用计数法?给对象添加一个引用计数器 , 每当有一个地方引用它 , 计数器就+1,;当引用失效时 , 计数器就-1;任何时刻计数器都为0的对象就是不能再被使用的 。
引用计数法的缺点?很难解决对象之间的循环引用问题 。
什么是根搜索算法?通过一系列的名为“GC Roots”的对象作为起始点 , 从这些节点开始向下搜索 , 搜索所走过的路径称为引用链(Reference Chain) , 当一个对象到 GC Roots 没有任何引用链相连(用图论的话来说就是从 GC Roots 到这个对象不可达)时 , 则证明此对象是不可用的 。
【JVM】关于JVM,你需要掌握这些 | 一文彻底吃透JVM系列

文章插图
Java 的4种引用方式?在 JDK 1.2 之后 , Java 对引用的概念进行了扩充 , 将引用分为
  1. 强引用 Strong Reference
  2. 软引用 Soft Reference
  3. 弱引用 Weak Reference
  4. 虚引用 Phantom Reference
强引用Object obj =newObject();代码中普遍存在的 , 像上述的引用 。只要强引用还在 , 垃圾收集器永远不会回收掉被引用的对象 。
软引用用来描述一些还有用 , 但并非必须的对象 。软引用所关联的对象 , 有在系统将要发生内存溢出异常之前 , 将会把这些对象列进回收范围 , 并进行第二次回收 。如果这次回收还是没有足够的内存 , 才会抛出内存异常 。提供了 SoftReference 类实现软引用 。
弱引用描述非必须的对象 , 强度比软引用更弱一些 , 被弱引用关联的对象 , 只能生存到下一次垃圾收集发生前 。当垃圾收集器工作时 , 无论当前内存是否足够 , 都会回收掉只被弱引用关联的对象 。提供了 WeakReference 类来实现弱引用 。
虚引用一个对象是否有虚引用 , 完全不会对其生存时间够成影响 , 也无法通过虚引用来取得一个对象实例 。为一个对象关联虚引用的唯一目的 , 就是希望在这个对象被收集器回收时 , 收到一个系统通知 。提供了 PhantomReference 类来实现虚引用 。
有哪些垃圾收集算法?

经验总结扩展阅读