美文网首页写作与程序JAVA程序员
Java核心技术讲解学习三

Java核心技术讲解学习三

作者: 胖琪的升级之路 | 来源:发表于2018-05-14 23:50 被阅读50次

前天我们在写Java技术讲解的时候说过引用现在在Java中分为四种类型,强引用,软引用弱引用幻象引用
但是这几者之间有什么关系呢?

Java中对象的可达性

在Java中我们都是通过分析来计算对象是否还是存活状态。不是存活状态的对象才能 被清理掉。那么这个分析就是称为可达性分析。这个算法的实现是建立在一系列称为GC Root 的对象作为起点的。根据这些起点往下面搜索。这样就构成了从头开始的多条支路的链式信息树。当最终对象是不可达的状态时就证明该对象已死,那么就可以可回收了。
** 那么什么样的对象可以称为GC ROOT呢?**
在 虚拟机书上是这么定义的

  • 虚拟机栈中引用的对象 -- 虚拟机栈 线程私有的属性
  • 方法区中静态属性引用的对象
  • 方法区中常量引用的对象 --方法区 与java堆一样都是各个线程共享的内存区域。
  • 本地方法栈JNI引用的对象 --本地方法栈与虚拟机栈 作用类似。本地方法栈执行的是Navite方法服务
可达性分析图

在可达性分析上我们判断训话找那个的算法就是这么一个流程。这个过程中在finalize 对象会有一次自己拯救自己的方式,如果再次不拯救自己进入幻象中,那么就可以让其真正的进行回收。

  • 强引用 也就是强可达:该对象可以让不同的线程通过各种引用访问的情况,简单来说就是我们新建的对象,在该线程中属于强可达状态
  • 软可达 : 只能通过软引用来达到的对象状态
  • 弱可达:弱引用状态的对象可达的装填
  • 幻象可达: 经过finalize之后的对象状态。没有引用能指向该对象
  • 不可达状态:对象可以清楚了。

垃圾回收算法

说完对象的引用之后我们都知道对象在哪种状态会被回收,然而在Java中我们使用的是gc来进行回收的那么,gc是利用什么条件进行回收呢?我们说下gc的算法了解下。gc的算法分为标记-清除算法复制算法标记-整理算法分代收集算法,四种算法

标记清除算法

标记-清除算法,分为两个阶段,首先是标记回收对象,然后统一回收对象。这是回收算法中最简单的算法。这个算法有两个不足之处

  1. 首先该算法是效率不高。
  2. 清除之后会产生很多碎片化空间


    垃圾回收

黑色 标记要清除的对象,白色未使用,黑色可回收。从图中可看到就算对象被回收之后造成了很多碎片空间,如果在程序运行的过程中创建了大对象,在空间中没有支持的空间,那么就会出现内存溢出的问题。

复制算法

复制算法是在上一个算法中提高了效率的解决问题。一般会将内存一份为二,一般内存使用完毕后,将对付复制到空余的地方上,进行清理,但是这个有问题就是每次内存只能使用一般,虽然效率提高但是整体内存缩小了。这是最基础的分割方式,
1. 在复制算法中将内存分为Eden和Survivor中存活着。
2. 当要复制对象时,创建多余的Survivor 就接收到使用的Survivor上的数据,虚拟机会进行清理Edec和Survivor上的数据
3. Survivor上的复制数据空间不足时,有其他内存进行担保。获得更多的数据


复制算法

这样我们在使用的时候就能使用多余的空间进行大对象的创建,不用担心空间不足的情况。

标记-整理算法

标记-整理算法是在标记-清除算法和复制算法基础上进行扩展的一种,标记过程都是一样的类型。然后在对象处理进行空间清理,不同点在于会将可回收的对象移动到一段,整体进行清理,这样大空间也会有,不会造成碎片化。效率也高,也能整个内存都应用上


标记-整理算法

分代收集算法

分代收集算法根据对象存活的时间不同,将其内存进行块分割,在每个快中进行各个级别的数据清理,该方式更加高效。对症下药


琪琪基地

相关文章

  • Java 语言原理

    Java核心技术讲解学习一 Java核心技术讲解学习二 Java核心技术讲解学习三 Java核心技术讲解学习四 J...

  • Java核心技术讲解学习三

    前天我们在写Java技术讲解的时候说过引用现在在Java中分为四种类型,强引用,软引用,弱引用,幻象引用。但是这几...

  • # [Java学习]1.Java基础【学习笔记】

    [Java学习]1.Java基础【学习笔记】 书籍 《Java核心技术》、《Java核心技术精讲》 2018-09...

  • Java核心技术讲解学习一

    做java有一段时间了。经常写业务代码,长时间里,自己只知道怎么使用其中的api,对于java的理解很多就忘记了。...

  • Java核心技术讲解学习二

    继续我们的Java核心知识点的学习。上面一篇说过虚拟机还有Java世界平台的简单知识,还顺便总结了Error和Ex...

  • Java核心技术讲解学习四

    上一节我们探讨了垃圾回收算法,简单的了解下垃圾回收在程序虚拟机中是怎样运行的。我们平常在开发中经常用的虚拟机是Ho...

  • Java核心技术讲解学习五

    昨天我们简单的了解安全点和安全区域了解HotSpot虚拟机是怎么快速的完成GC的,这次我们才了解下期中使用的垃圾回...

  • 浅谈Java内部类

    由于Java核心技术上的例子很不错,本篇内部类博客部分代码以Java核心技术上的例子进行讲解。 内部类总览 内部类...

  • java修炼书籍

    1,《java核心技术(卷1)》 2,《java核心技术(卷1)》 3, 《java学习指南(第四版)》 4,《e...

  • Java核心技术讲解六

    上次文章的简单的学习了虚拟机相关的知识。可以点击java核心技术讲解学习五这篇文章来说下简单的知识,也是我们经常用...

网友评论

    本文标题:Java核心技术讲解学习三

    本文链接:https://www.haomeiwen.com/subject/bvdsdftx.html