作用:存放对象实例 。垃圾收集器主要管理的就是 Java 堆 。Java 堆在物理上可以不连续 , 只要逻辑上连续即可 。
方法区(线程共享)方法区(Method Area)被所有线程共享 , 用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据 。
和 Java 堆一样 , 不需要连续的内存 , 可以选择固定的大小 , 更可以选择不实现垃圾收集 。
运行时常量池运行时常量池(Runtime Constant Pool)是方法区的一部分 。保存 Class 文件中的符号引用、翻译出来的直接引用 。运行时常量池可以在运行期间将新的常量放入池中 。
Java 中对象访问是如何进行的?Object obj =newObject();
对于上述最简单的访问 , 也会涉及到 Java 栈、Java 堆、方法区这三个最重要内存区域 。
Object obj
如果出现在方法体中 , 则上述代码会反映到 Java 栈的本地变量表中 , 作为 reference 类型数据出现 。
newObject()
反映到 Java 堆中 , 形成一块存储了 Object 类型所有对象实例数据值的内存 。Java堆中还包含对象类型数据的地址信息 , 这些类型数据存储在方法区中 。
如何判断对象是否“死去”?
- 引用计数法
- 根搜索算法
引用计数法的缺点?很难解决对象之间的循环引用问题 。
什么是根搜索算法?通过一系列的名为“GC Roots”的对象作为起始点 , 从这些节点开始向下搜索 , 搜索所走过的路径称为引用链(Reference Chain) , 当一个对象到 GC Roots 没有任何引用链相连(用图论的话来说就是从 GC Roots 到这个对象不可达)时 , 则证明此对象是不可用的 。
文章插图
Java 的4种引用方式?在 JDK 1.2 之后 , Java 对引用的概念进行了扩充 , 将引用分为
- 强引用 Strong Reference
- 软引用 Soft Reference
- 弱引用 Weak Reference
- 虚引用 Phantom Reference
Object obj =newObject();
代码中普遍存在的 , 像上述的引用 。只要强引用还在 , 垃圾收集器永远不会回收掉被引用的对象 。软引用用来描述一些还有用 , 但并非必须的对象 。软引用所关联的对象 , 有在系统将要发生内存溢出异常之前 , 将会把这些对象列进回收范围 , 并进行第二次回收 。如果这次回收还是没有足够的内存 , 才会抛出内存异常 。提供了 SoftReference 类实现软引用 。
弱引用描述非必须的对象 , 强度比软引用更弱一些 , 被弱引用关联的对象 , 只能生存到下一次垃圾收集发生前 。当垃圾收集器工作时 , 无论当前内存是否足够 , 都会回收掉只被弱引用关联的对象 。提供了 WeakReference 类来实现弱引用 。
虚引用一个对象是否有虚引用 , 完全不会对其生存时间够成影响 , 也无法通过虚引用来取得一个对象实例 。为一个对象关联虚引用的唯一目的 , 就是希望在这个对象被收集器回收时 , 收到一个系统通知 。提供了 PhantomReference 类来实现虚引用 。
有哪些垃圾收集算法?
经验总结扩展阅读
- 2023年9月15日适合入宅吗 2023年9月15日入宅黄道吉日
- 2023年农历八月初一宜祭祖吗 2023年9月15日祭祖黄道吉日
- JVM学习笔记——垃圾回收篇
- 2023年1月27日取蜂蜜行吗 2023年1月27日适合取蜂蜜吗
- 2023年农历正月初六安装房门吉日 2023年1月27日是安装房门的黄道吉日吗
- 2023年1月27日举办成人仪式行吗 2023年1月27日举办成人仪式吉日一览表
- 银手镯变黑是生病了吗?
- 九州缥缈录铁皇结局是什么?
- 向前是什么电视剧的男主角?
- 长脸型适合什么样的眼镜?