【全栈之路】JAVA基础课程2_数据类型和垃圾回收机制(20190611v1.0)

欢迎进入JAVA基础课程

博客地址:https://blog.csdn.net/houjiyu...
本系列文章将主要针对JAVA一些基础知识点进行讲解,为平时归纳所总结,不管是刚接触JAVA开发菜鸟还是业界资深人士,都希望对广大同行带来一些帮助。若有问题请及时留言或加QQ:243042162。

寄语:
经历过国考、省考,参加过各种证书考试,无疑对于上了年纪的人来说时刻有着莫大的危机感,时刻想着如何摆脱目前的困境。经常跟身边的同事去讨论20年后你在这个行业处于什么位置,当想想如果20年后还处于现在的位置是多么可怕的一件事情。悟性可以差点,时间可晚点,但学习跟积累必须跟上,与时俱进,搬砖人才可能脱胎换骨,收割事业的成就感与满足感。

数据类型

1. 基础数据类型:

  • 数值型

    • 整型数据(byte |short |int |long)
    • 浮点类型(float |double)
  • 字符型(char)
  • 布尔型(boolean)

2. 引用数据类型:

  • 类(class)
  • 接口(interface)
  • 数组
注意事项
&:左右都判断,可作位运算和逻辑与运算符
&&:左假则结束,左真判断右,可作逻辑与运算符

垃圾回收机制

之前网络上见过两个很搞笑的图比喻C语言和JAVA之间的垃圾回收机制,如下图所示

C语言
【全栈之路】JAVA基础课程2_数据类型和垃圾回收机制(20190611v1.0)

JAVA语言
【全栈之路】JAVA基础课程2_数据类型和垃圾回收机制(20190611v1.0)

(1)C的垃圾回收是人工的,工作量大,但是可控性高。
(2)JAVA是自动化的,但是可控性很差,甚至有时会出现内存溢出的情况。
(3)System.gc(),用于调用垃圾收集器,在调用时,垃圾收集器将运行以回收未使用的内存空间。它将尝试释放被丢弃对象占用的内存。然而System.gc()调用附带一个免责声明,无法保证对垃圾收集器的调用。所以System.gc()并不能说是完美主动进行了垃圾回收。

1. 确定哪些对象要进行回收

经典算法:引用计数法、可达性分析算法

2. 什么时候进行回收

  • 会在cpu空闲的时候自动进行回收
  • 在堆内存存储满了之后
  • 主动调用System.gc()后尝试进行回收

3. 如何回收

相关算法:标记-清除算法、复制算法、标记-整理算法、分代收集算法

  • 标记-清除算法 (效率和内存碎片问题):这是最基础的一种算法,分为两个步骤,第一个步骤就是标记,也就是标记处所有需要回收的对象,标记完成后就进行统一的回收掉哪些带有标记的对象。这种算法优点是简单,缺点是效率问题,还有一个最大的缺点是空间问题,标记清除之后会产生大量不连续的内存碎片,当程序在以后的运行过程中需要分配较大对象时无法找到足够的连续内存而造成内存空间浪费。

【全栈之路】JAVA基础课程2_数据类型和垃圾回收机制(20190611v1.0)

  • 复制算法(适用于对象存活率低的场景) :复制将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。这样使得每次都是对其中的一块进行内存回收,内存分配时也就不用考虑内存碎片等复杂情况。只是这种算法的代价是将内存缩小为原来的一半。

【全栈之路】JAVA基础课程2_数据类型和垃圾回收机制(20190611v1.0)

  • 标记整理算法(适用于对象存活率高的场景) :标记整理算法与标记清除算法很相似,但最显著的区别是:标记清除算法仅对不存活的对象进行处理,剩余存活对象不做任何处理,造成内存碎片;而标记整理算法不仅对不存活对象进行处理清除,还对剩余的存活对象进行整理,重新整理,因此其不会产生内存碎片。

【全栈之路】JAVA基础课程2_数据类型和垃圾回收机制(20190611v1.0)

  • 分代收集算法 (根据存活周期分为不同的几块):分代收集算法是一种比较智能的算法,也是现在jvm使用最多的一种算法,他本身其实不是一个新的算法,而是他会在具体的场景自动选择以上三种算法进行垃圾对象回收。

【全栈之路】JAVA基础课程2_数据类型和垃圾回收机制(20190611v1.0)