加入收藏 | 设为首页 | 会员中心 | 我要投稿 辽源站长网 (https://www.0437zz.com/)- 云专线、云连接、智能数据、边缘计算、数据安全!
当前位置: 首页 > 综合聚焦 > 资源网站 > 空间 > 正文

你真的了解JVM吗?

发布时间:2019-10-18 02:16:02 所属栏目:空间 来源:Klausss
导读:对于java程序员小白来说(没错,是我),jvm总是笼罩着一层神秘的面纱的,java是如何分配内存的,又是如何回收内存的呢?有人说内存管理是一道墙,墙里面的人想出去,墙外面的人想进去。而我们java程序员,就是硬着头皮进去的那群人... 学习的目的很简单 ----

堆内存的分配和回收:我们着重讲一下虚拟机在堆上的垃圾收集,在线程私有的内存分区中,内存会随着方法结束或者线程的结束而回收,所以这部分没有太多的操作空间,而堆和方法区是被所有线程所共享的一块区域,也是我们有必要深入了解的区域。

a).判断对象的存活:在内存泄漏的知识点中提到过 可达性算法 这一概念,在可达性算法中,有一个 GC Roots 的概念,这个算法的基本思想就是如果一个对象到 GC Roots没有任何引用链相连(也就是从GC Roots到这个对象不可达)时,则证明此对象是不可用的,他们会被判定为是可回收的对象;

除此之外,还有另一个更简单的方法,给每个对象添加一个引用计数器,如果有一个地方引用它,计数器加1,引用失效的时候,计数器减1,计数器的值为0时这个对象就是可回收的,这是 引用计数算法 的基本思想,但是引用计数算法无法解决循环引用的问题,可以看到如下图的4、5、6三个对象,存在相互循环的引用,导致这三个对象的引用计数器不为0,但是这三个对象的的确确是属于需要回收的范畴的,这也是很多主流虚拟机放弃使用引用计数算法的原因。

你真的了解JVM吗?

你真的了解JVM吗?

在java中,可以作为GC Roots的对象有4种:

  1. 1).虚拟机栈(栈帧中的本地变量表)中引用的对象 
  2.  
  3. 2).方法区中类静态属性引用的对象 
  4.  
  5. 3).方法区中常量引用的对象 
  6.  
  7. 4).本地方法栈中JNI(即一般说的Native方法)引用的对象 

b).对象引用:java中定义了四种引用,引用强度从强到弱依次是 强引用 、 软引用 、 弱引用 和 虚引用 。

你真的了解JVM吗?

c).回收对象:如果一个对象是GC Roots不可达的,也 不一定 会被回收,如果这个对象 覆盖 了finalize()方法并且这个finalize()方法是 第一次 被虚拟机调用,那么此时会执行对象的finalize()方法,如果在方法中,它重新与引用链中的任意一个对象建立了关联 ,那么它就可以逃过被回收的命运。

垃圾收集算法

上面介绍了堆上对象从创建到回收的过程,那么下面我们就来了解一下虚拟机到底是用什么样的方式来回收对象。

  1. 标记-清除算法:将回收过程分为“标记”和“清除”两个阶段,首先标记出需要回收的对象, 
  2.     然后标记完成以后统一回收所有被标记的对象,这是最基础的收集算法,主要有两个比较大的缺陷, 
  3.     一是效率低;二是产生大量不连续的内存碎片,这些空间无法被较大对象利用起来 
  4.      
  5.     复制算法:将可用内存按容量分为大小相等的两块,每次只使用其中的一块,当这块的内存用完了, 
  6.     就将存活的对象复制到另外一块上,然后将这块的内存全部清理掉; 
  7.     这样复制到另一块上的已使用内存是规整的,再分配时就可以使用前面提到过的“指针碰撞法” 
  8.     但是我们可以发现这种做法每次只能使用一半的内存,付出的代价未免太大。 
  9.      
  10.     标记-整理算法:标记的过程与“标记-清除”算法一样,后续将所有存活的对象向一端移动,然后清理掉边界外的内存 
  11.      
  12.     分代收集算法:准确来说这不是一种算法,而是根据虚拟机中不同对象的存活周期不同,将内存进行分代, 
  13.     一般是分为新生代(Young)和老年代(Old),新生成的对象优先存放在新生代中,新生代对象朝生夕死,存活率很低, 
  14.     比较适合用复制算法,在新生代中,常规应用进行一次垃圾收集一般可以回收70% ~ 95% 的空间,回收效率很高。 
  15.      在新生代中经历了多次(具体看虚拟机配置的阀值,默认15次)GC后仍然存活下来的对象会进入老年代中。 
  16.      老年代中的对象生命周期较长,存活率比较高,在老年代中进行GC的频率相对而言较低,而且回收的速度也比较慢, 
  17.      老年代没有额外的空间进行分配担保,所以比较适合用“标记-清理”或者“标记-整理”算法进行回收 

你真的了解JVM吗?

(编辑:辽源站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读