深入理解JVM
Guoshi_Wan
往事越千年,魏武挥鞭,东临碣石有遗篇,萧瑟秋风今又是,换了人间!
展开
-
深入理解Java虚拟机之垃圾收集器及相关参数整理
截止JDK1.8,主要的垃圾收集器如下所示:注1:浮动垃圾,当次回收无法清除的垃圾,产生于用户线程与GC线程并发执行名称 使用区域 缺点 优点 版本 算法 Serial 新生代 单线程收集,导致Stop the World 简单、高效,无线程交互开销 1.3.1前 复制 ParNew 新生代 导致Stop th...原创 2019-10-30 20:35:55 · 240 阅读 · 0 评论 -
深入理解Java虚拟机之垃圾收集算法(2)
深入理解Java虚拟机之垃圾收集算法(2)这一篇我们说一下垃圾收集算法中的,“暂停-复制”算法,暂停复制算法是为了补充“标记-清除” 算法的不足出现的,这个算法解决了“标记-清除”算法效率不高且产生内存碎片的缺点。它将内存分 为两块大小相等的区域,每次只使用一块。当这一块内存用完的时候就将这块内存上存活的对象复制到 另一块大小相等的区域中,再将原来的区域清理掉。这样一来每次产生对象都是移原创 2017-12-07 22:42:13 · 345 阅读 · 0 评论 -
深入理解Java虚拟机之对象的访问定位
深入理解Java虚拟机之对象的访问定位 我们知道对象是位于堆上的,而对象的引用也就是reference是位于java虚拟机栈上的,那么我们通过什么方式去将reference定位到堆上的对象呢?主要有两种办法,分别是通过句柄定位和直接指针定位:1、使用句柄定位的话,虚拟机会在堆中划分一块内存区域作为句柄池,reference存储的就是句柄池中的对象地址,也就是reference指向的是句原创 2017-11-27 22:02:00 · 1320 阅读 · 0 评论 -
深入理解Java虚拟机之对象的创建过程
深入理解Java虚拟机之对象的创建过程Java作为一门面向对象语言,在程序运行过程中会产生大量的对象,在语言层面上来看,创建一个对象仅仅需要一个new关键字即可,但是在虚拟机中创建一个普通的Java对象(不包括Class对象和数组)的过程你是否了解? 当虚拟机遇到一条new指令的时候,会首先去检查一下在常量池中能否定位到一个类的符号引用和指令参数相匹配,并检查这个引用符号所代表的类是否已经执行过原创 2017-11-23 22:17:23 · 1134 阅读 · 0 评论 -
深入理解Java虚拟机之垃圾收集算法(1)
深入理解Java虚拟机之垃圾收集算法(1)这一篇博客我们介绍一下虚拟机的垃圾收集算法,最基础的垃圾收集算法是“标记-清除”法,顾名思义 这个算法分为两个步骤,标记和清除,首先对需要进行回收的对象进行标记,如何进行标记在之前的博客里面 已经说过了,这里就不赘述了,标记完成之后,对所有进行标记过得对象进行回收。之所以说这个算法是最基 础的算法是因为之后的算法都是对这个算法进行的改进和补充,这个算法原创 2017-12-05 22:04:36 · 242 阅读 · 0 评论 -
深入理解Java虚拟机之对象存活算法的实现
深入理解Java虚拟机之对象存活算法的实现在之前的博客中提到过,判断对象是否存活的方式有两种,一种是标记计数法,一种是可达性分析算法, 由于标记计数法不能解决循环引用的问题,所以大多数的虚拟机采用的都是可达性分析算法。但是我们知道 在可达性分析中可以作为GC Roots的节点主要位于全局性的引用(常量或类的静态成员变量)与执行的上下 文(Java虚拟机栈或本地方法栈的变量表)中,比方说有的应用原创 2017-12-13 20:51:41 · 968 阅读 · 0 评论 -
深入理解Java虚拟机之垃圾收集算法(3)
深入理解Java虚拟机之垃圾收集算法(3)今天说一下垃圾收集算法中的最后一个,“标记-整理算法”,之前说过,“暂停-复制算法”会导致部分空间 的浪费,而且需要有额外的空间进行担保,确保每次暂停复制的时候再另一块空间超出的时候有额外的空间存储, 所以在新生代会采用“暂停-复制算法”,但是在老年代会采用“标记-整理”算法。 “标记整理”算法和“标记-清除”算法比较像,但是在标记完对象之后,不会对可原创 2017-12-12 22:09:07 · 264 阅读 · 0 评论 -
深入理解Java虚拟机之运行时数据区域
深入理解Java虚拟机之运行时数据区域JVM在java程序运行时会将它所管理的内存分为不同的区域,这些区域都要不同的用途和各自的创建销毁时间,主要包含下面几个区域:程序计数器Java虚拟机栈本地方法栈Java堆方法区运行时常量池(属于方法区)下面我们来分别介绍一下这些区域的作用以及所包含的内容。1、 程序计数器,是线程私有的,是一块较小的内存区域,可以看作是当前线程所执行的字节码的原创 2017-11-22 22:33:10 · 1110 阅读 · 0 评论 -
深入理解Java虚拟机之对象存活算法的实现(2)
深入理解Java虚拟机之对象存活算法的实现(2)因为HotSpot是准确式GC(前一篇有说),并且是借助OopMap的协助来实现的, 所以就引出了一个问题,导致引用发生变化或者说导致OopMap发生修改的操作可能有 很多,如果每一个指令都生成一个OopMap这根本就不现实,因为如此以来空间成本就 太高了。所以HopSpot并不是为每一条指令都生成一个OopMap的,而是在特点的一些 位置将引原创 2017-12-19 21:56:15 · 928 阅读 · 0 评论 -
深入理解Java虚拟机之回收方法区
深入理解Java虚拟机之回收方法区 很多人认为在Java虚拟机中,方法区是不存在垃圾回收的,因此方法区也成为永久代,在Java虚拟机规范中的确没有要求方法区进行垃圾回收,这是因为方法区的垃圾回收“性价比”比较低,在堆中进行一次GC,往往可以回收75%到95%的空间,而在方法区中的回收效率远远低于此值。 所以,方法区并不是没有垃圾回收,在方法区的垃圾回收主要分为两个部分:对废弃原创 2017-11-30 23:04:15 · 1279 阅读 · 0 评论 -
深入理解Java虚拟机之引用与对象回收
深入理解Java虚拟机之引用与对象回收 在JDK1.2之前Java对引用的定义是这样的:如果栈中reference数据指向的是另一块内存的其实地址,就称之为这个内存的一个引用。这种定义比较纯粹但是过于狭隘,因为这种情况下一个对象只有两种状态,被引用和未被引用,但是如果有一些我们希望当内存够用的时候保留下来,当内存不够用的时候再回收掉的对象,我们就无法简单的用被引用和未被引用这两种状态来表述原创 2017-11-29 21:26:50 · 1370 阅读 · 0 评论 -
深入理解Java虚拟机之对象的内存布局
深入理解Java虚拟机之对象的内存布局对象在内存中的布局主要分为三块,对象头,实例数据和对齐填充。1、其中对象头主要包含两部分的信息,一部分是对象自身的运行时数据,例如hashcode、GC年代、锁状态、线程持有的锁、偏向线程的ID、偏向时间戳等,这部分的数据在32位虚拟机和64位虚拟机上的大小分别也是32位和64位,也称作Mark Word。因为考虑到虚拟机的空间效率,所以Mark Word原创 2017-11-26 20:53:04 · 1314 阅读 · 0 评论 -
深入理解Java虚拟机之判断对象是否存活
深入理解Java虚拟机之判断对象是否存活 我们知道Java虚拟机中对象的存储位置在堆上,所以GC回收主要也就是在堆上进行的,那么垃圾收集器在进行对象回收的时候肯定不能随便收集,必须要判断对象的状态是不是可以被收集,也就是说对象是不是已经“死亡”?那么垃圾收集器是如何判断对象是否已经死亡呢? 在Java虚拟机中判断对象是否死亡有两中算法,分别是引用计数算法和可达性分析算法。原创 2017-11-28 21:59:50 · 1560 阅读 · 0 评论