加入收藏 | 设为首页 | 会员中心 | 我要投稿 衡阳站长网 (https://www.0734zz.cn/)- 数据集成、设备管理、备份、数据加密、智能搜索!
当前位置: 首页 > 综合聚焦 > 资源网站 > 空间 > 正文

Java后端开发三年,你不得不了解的JVM

发布时间:2019-06-08 09:07:31 所属栏目:空间 来源:JavaSpring高级进阶
导读:JAVA程序员,三年是个坎,如果过了三年你还没有去研究JVM的话,那么你这个程序员只能是板砖的工具了。下面来个JVM的解析可好? JVM是Java Virtual Machine(Java虚拟机)的缩写,也就是指的JVM虚拟机,属于是一种虚构出来的计算机,在我们实际的电脑上来进行

我们每次new对象的时候都会先在新生代的Enden区放着也就是最开始 是这样子的

Java后端开发三年,你不得不了解的JVM

然后在Enden用完的时候里面会出现待回收的

Java后端开发三年,你不得不了解的JVM

然后就来了把存活的对象复制放到Survior1(from)中,待回收的等待给他回收掉 就是这样的

Java后端开发三年,你不得不了解的JVM

然后把Enden区清空回收掉

Java后端开发三年,你不得不了解的JVM

这样的话 第一次GC就完成了,下面再往下走

当Enden充满的时候就会再次GC

先是这个样子的

Java后端开发三年,你不得不了解的JVM

然后会把 Enden和Survoir1中的内容复制到Survior中,

Java后端开发三年,你不得不了解的JVM

然后就会把Enden和Survior进行回收

Java后端开发三年,你不得不了解的JVM

然后从Enden中过去的就相当于次数少的,而从Survior1中过去的就相当于移动了2次

Java后端开发三年,你不得不了解的JVM

这样新生代的GC就执行了2次了,

当Enden再次被使用完成的时候,就会从Survior2复制到Survior1中

Java后端开发三年,你不得不了解的JVM

经过回收之后Surior1就变了,1对象是从Enden直接复制过来的,2对象是Enden-->Survior2-->Survior1 ,3对象则是从Enden-->Surivior1-->Survior2-->Survior1 复制过来的,这样一步一步的执行下去的时候,就是新生代的GC。

既然这样,那为什么还会存在老年代呢?其实如果GC在执行的时候有些对象一直没有被回收,那么他移动次数就会无限的累计,每次从Surior(from)到Surior(to)的过程中就相当于又增加了一次移动,当他达到一定的次数的时候(默认是15),就会移动到老年代里了,所以不存在不会被回收的对象,但是这个次数可以设置的,

-XX:MaxTenuringThreshold

就类似这样子

Java后端开发三年,你不得不了解的JVM

其实上边的这只是一种情况,还有就是如果对象太大,存不下,那就直接会进入老年代。

还有那种默认就是长期活着的也会进入老年代,

而且这种复制算法的垃圾回收机制是比较浪费内存的,每次都会有一块内存区是闲着不干活的,但是优点很明显,简单高效

以上就是GC中垃圾回收中的新生代复制算法解析,新生代的Minor GC也算是知道了不少东西了,以上就是一些个人的见解,图比较清晰,容易理解,有不对的地方希望能够各位同行指点一下。

【编辑推荐】

  1. JVM 理解其实并不难!
  2. 程序员从宏观、微观角度浅析JVM虚拟机!
  3. 听说又被 JVM 内存区域方面的面试题给虐了?看看这篇文章吧!
  4. 分布式系统Kafka和ES中,JVM内存越大越好吗?
  5. JVM 与 Linux 的内存关系详解
【责任编辑:武晓燕 TEL:(010)68476606】
点赞 0

(编辑:衡阳站长网)

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

推荐文章
    热点阅读