资讯专栏INFORMATION COLUMN

JVM与GC(一)

keithyau / 1502人阅读

摘要:运行时数据区域名词解释程序计数器线程私有,存储每个线程的指令,不存储方法内容。方法报错的时候异常栈能告诉在代码的哪一行,就是程序计数器的功能。栈帧保存对堆内对象的引用。堆线程共享,存储对象实例,就是回收这一部分。

JVM运行时数据区域

名词解释

程序计数器(Program Counter Register):线程私有,存储每个线程的JVM指令,不存储native方法内容。方法报错的时候异常栈能告诉在代码的哪一行,就是程序计数器的功能。

虚拟机栈(VM Stack):每个线程私有,存储方法调用栈和线程局部基本类型变量。栈帧保存对堆内对象的引用。

堆(Heap):线程共享,存储对象实例,GC就是回收这一部分。由于堆区域线程共享,对象在堆中分配需要加锁,这个操作增大开销,所以会先做逃逸分析,将线程本地小对象尝试在TLAB(Thread Local Allocation Buffer)中分配,如果不能才去堆中的Eden分配。TLAB默认是Eden的1%,大对象在TLAB放不下,就在Eden分配了,所以多个小对象可能比一个大对象分配要快。

运行时常量池(Runtime Constant Pool):在方法区中分配,类的常量信息,方法引用信息,字符串常量等。

堆内结构

简单地说,新对象出生在Eden,如果Eden不够了,触发gc(Minor GC)把存活的对象搬到s0,下次gc又搬到s1,再下次又搬到s0,如此往复,一个对象被搬到一定次数就是几岁,达到这个阈值就进入老年代。(默认15岁,就是一个狗狗的寿命)老年代满了也会gc(Major GC/Full GC)

GC算法

Mark-Sweep 标记清除算法

顾名思义,两个阶段,先标记不被引用的对象,再清除掉,腾出内存。就像把围棋里被吃掉的棋子提出来。
缺点:空间碎片多

Copying 复制算法

把空间等分两块,一块满了将所有活着的对象复制到另一个块空间,再一次清理掉之前的空间。
优点:解决了碎片问题
缺点:可用内存变低了

Mark-Compact 标记整理算法

标记之后,把存活的对象都移动到内存一端,把端边界以外的内存空间清理掉。
没有碎片,也能充分利用内存空间。老年代通常使用这种算法。

回收目标

引用计数为空的对象:每个对象有引用计数器,有引用就+1,引用失效就-1,为0则不可能再被使用。
GC root引用链搜索不到的对象:以GC root的对象为起点,沿它的引用搜索,引用链中搜索不到的对象也不会被使用。

参考文章:
https://www.cnblogs.com/zhouy...
https://www.cnblogs.com/wjtai...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/75149.html

相关文章

  • JVM 的 工作原理,层次结构 以及 GC工作原理

    摘要:执行引擎作用执行字节码,或者执行本地方法运行时数据区其实就是指在运行期间,其对内存空间的划分和分配。 虽是读书笔记,但是如转载请注明出处https://uestc-dpz.github.io..拒绝伸手复制党 JVM Java 虚拟机 Java 虚拟机(Java virtual machine,JVM)是运行 Java 程序必不可少的机制。JVM实现了Java语言最重要的特征:即平台...

    qqlcbb 评论0 收藏0
  • [译]GC专家系列2:Java 垃圾回收的监控

    摘要:原文链接这是专家系列文章的第二篇。运行在本地虚拟机上的应用的又称为,通常与相同。性能数据需要持续观察,因此在运行时需要定时输出的监控信息。新生代容量的统计信息。是提供的一个式的图表监控工具。 原文链接:http://www.cubrid.org/blog/dev-platform/how-to-monitor-java-garbage-collection/ 这是GC专家系列文章的第二...

    yiliang 评论0 收藏0
  • JVM垃圾回收

    摘要:这个算法看似不错而且简单,不过存在这一个致命伤当两个对象互相引用的时候,就永远不会被回收于是引用计数算法就永远回收不了这两个对象,下面介绍另一种算法。 前言 ​ 如果要问Java与其他编程语言最大的不同是什么,我第一个想到的一定就是Java所运行的JVM所自带的自动垃圾回收机制,以下是我学习JVM垃圾回收机制整理的笔记,希望能对读者有一些帮助。 哪些内存需要回收?what? ​ ...

    stormzhang 评论0 收藏0
  • 文了解JVM

    摘要:而使用虚拟机是实现这一特点的关键。每个字节码指令都由一个字节的操作码和附加的操作数组成。字节码可以通过以下两种方式转换成合适的语言解释器一条一条地读取,解释并执行字节码执行,所以它可以很快地解释字节码,但是执行起来会比较慢。 一、什么是JVM JVM是Java Virtual Machine(Java 虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实...

    whatsns 评论0 收藏0
  • Java 垃圾回收(GC) 泛读

    摘要:在这种消耗很高的状态下,应用程序所有的线程都会挂起,暂停一切正常的工作,等待垃圾回收的完成。但是,因为线程切换和上下文转换的消耗,会使得垃圾回收的总体成本上升,造成系统吞吐量的下降。 Java 垃圾回收(GC) 泛读 文章地址: https://segmentfault.com/a/1190000008922319 0. 序言 带着问题去看待 垃圾回收(GC) 会比较好,一般来说主要的...

    haoguo 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<