![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
深入理解java虚拟机
b_eethoven
这个作者很懒,什么都没留下…
展开
-
HotSpot新生代的垃圾回收分配比例8:1:1
新生代中的对象98%是朝生夕死的,所以并不需要按照1: 1的比例来划分内存空间,而是将内存分为一块较大的Eden空间和两块较小的Survivor空间,每次使用Eden和其中的一块Survivor。当回收时,将Eden和Survivor中还存活着的对象一次性地拷贝到另外一块Survivor空间上,最后清理掉Eden和刚才用过的Survivor的空间。HotSpot虚拟机默认Eden和Survivor的大小比例是8: 1,也就是每次新生代中可用内存空间为整个新生代容量的90%(80%+10%),只有10%的内存原创 2020-07-17 17:31:56 · 941 阅读 · 1 评论 -
一分钟带你了解:垃圾回收的复制算法
原理为了解决标记清除算法的效率问题,一种称为“复制”(Copying)的收集算法出现了,它将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。这样使得每次都是对其中的一块进行内存回收,内存分配时也就不用考虑内存碎片等复杂情况,只要移动堆顶指针,按顺序分配内存即可,实现简单,运行高效。缺点同时只有一半的内存被使用复制算法执行过程如下图:-----------------------------原创 2020-07-17 17:08:50 · 278 阅读 · 1 评论 -
一分钟带你了解:标记-清除算法
原理最基础的收集算法是“标记一清除”(Mark-Sweep) 算法,如它的名字- -样,算法分为“标记”和“清除”两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收掉所有被标记的对象。之所以说它是最基础的收集算法,是因为后续的收集算法都是基于这种思路并对其缺点进行改进而得到的。缺点1、效率问题,标记和清除过程的效率都不高:2、空间问题,标记清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致,当程序在以后的运行过程中需要分配较大对象时无法找到足够的连续内存而不得不提前触发另一次垃圾收原创 2020-07-17 16:52:08 · 914 阅读 · 4 评论 -
一分钟带你了解java的四种引用:强引用、软引用、弱引用、虚引用
强引用强引用就是指在程序代码之中普遍存在的,类似Object obj = new Object()这类的引用,只要强引用还存在,垃圾收集器永远不会回收掉被引用的对象。当内存空间不足是jvm会抛出oom错误,也不会回收强引用对象。软引用软引用用来描述一些还有用但非必须的对象,对于软引用关联的对象,在系统发生oom异常之前将会把这些对象列为可回收对象,并进行二次回收,如果这次回收之后,内存还不足,才会抛出oom错误弱引用弱引用用来描述非必须的对象,但他的强度不软引用更弱一些,被弱引用关联的对象只能生存原创 2020-07-17 15:45:40 · 167 阅读 · 1 评论 -
一分钟带你了解:根搜索算法
原理通过一系列名为“GC Roots”的对象作为起点,从这些节点开始向下搜索,搜索所走过的路径被称为引用链(Refreance Chain),当一个对象没有任何引用链相连,则证明此对象不可用。如下图所示,object6、object7、object8虽然相互关联但是他们到GC Roots是不可达的,所以将他们判定为不可回收的对象在java语言中可作为GC Roots的对象包括以下四种:1、虚拟栈中(栈帧中的本地变量表)引用的对象2、方法区中的类静态属性引用的对象3、方法区中常量引用的对象4、本原创 2020-07-17 14:42:31 · 738 阅读 · 3 评论 -
一分钟带你了解:引用计数算法
原理给对象添加一个计数器,每当有一个地方引用时计数器值就+1;当引用失效时就-1;任何时刻计数器都为0的对象就是不可能再被使用的对象。优点实现简单,判断效率高缺点很难解决对象之间的相互循环引用问题。ps:这也是java语言没有没有采用引用计数算法来管理内存的主要原因--------------------------------------------分割线---------------------------------------------------------以上知识均来源于该书籍原创 2020-07-17 14:11:04 · 329 阅读 · 1 评论