理解JVM之GC&内存分配

垃圾回收机制

  • 对象存活判定算法
  • 垃圾收集算法
  • HotSpot算法实现和垃圾收集器
  • 内存分配和回收策略

    1.  对象存活判定算法(JVM回收那些对象)

  概念:四种引用类型

  •  强引用:及时内存不足也不会被GC,不会随意回收强引用对象;即使抛出OOM(OutOfMemoryError),也不会随意回收强引用对象
  •  软引用:只有内存不足时,会被GC;回收后内存不足会抛出OOM异常
  •  弱引用:无论当前内存是否充足都会被GC
  • 虚引用:任何时候都会别GC

  a.引用计数算法:给对象添加一个引用计数器,每当有一个地方引用他的时候就加1,当有引用失效的时候就减1;任何时刻计数器为0的对象是不能被使用的

  (但是因为他不能解决相互循环引用问题,所以没有被主流JVM所使用)

  b.可达性分析法:以【GC ROOT】对象作为起始点,从这个节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到GC ROOT没人任何引用链时,则                   这个对象是不可用的。


可以作为GC ROOT的对象

  • 虚拟机栈中引用的对象,主要是指栈帧中的本地变量
  • 本地方法栈中Native方法引用的对象
  • 方法区中类静态属性引用的对象
  • 方法区中常量引用对象

需要注意的是:在可达性分析法中被判定不可达对象未必真的就判死刑了,至少要经历两次标记过程,判断对象是否有必要执行finalize(),若判定有必要的话,还会在进行一次筛选,在finalize()中如果该对象与引用链中的任何一个对象建立关系,则它将被移除"即将回收"的集合

    2.垃圾收集算法(介绍JVM怎么回收掉这些对象)

      a.分代收集算法(是当前商业虚拟机都采用的一种算法)

  • 新生代:大批对象死去,只有少量存活。使用『复制算法』,只需复制少量存活对象即可
  • 老年代:对象存活率高。使用『标记—清理算法』或者『标记—整理算法』,只需标记较少的回收对象即可。

      b.复制算法

  • 把可用内存按容量划分为相等的两块,每次只使用其中一块。当其中一块内存用尽后,把还存活着的对象复制到另外一块内存,在将这一块内存清理掉。
  • 优点:每次都是对整个半区进行内存回收,无需考虑内存碎片等情况。只要移动堆顶指针,按顺序分配内存即可,实现简单,运行高效
  • 缺点:每次可使用的内存缩小为原来的一半,内存使用率低

有研究表明新生代中的对象98%是朝生夕死的,因此没必要按照1:1来划分内存空间,而是分为一块较大的Eden空间和两块较小的Survivor空间,

在HotSpot虚拟机中默认比例为8:1:1。每次使用Eden和一块Survivor,回收时将这两块中存活着的对象一次性地复制到另外一块Survivor上,再做清理。可见只有10%的内存会被“浪费”,倘若Survivor空间不足还需要依赖其他内存(老年代)进行分配担保。

       c.标记清除法:首先标记需要被回收的对象,然后统一清除这些对象

      缺点:标记、清除效率不高;空间碎片太多,会产生大量不连续的空间碎片,可能会导致在后面需要分配较大对象时,因为无法找到连续较大的空间而提前        触发另一次GC,影响性能。

      d.标记-整理算法:首先『标记』出所有需要回收的对象,然后进行『整理』,使得存活的对象都向一端移动,最后直接清理掉端边界以外的内存。

      优点:即没有浪费50%的空间,又不存在空间碎片问题,性价比较高。

      一般情况下,老年代会选择标记-整理算法。

原文地址:https://www.cnblogs.com/9797ch/p/12556345.html

时间: 2024-08-28 08:16:44

理解JVM之GC&内存分配的相关文章

【深入理解JVM】:内存分配与回收策略

Java技术体系中所提倡的自动内存管理最终可以归结为自动化地解决了两个问题:给对象分配内存以及回收分配给对象的内存. 对象的内存分配,往大方向讲,就是在堆上分配,对象主要分配在新生代的Eden区上,如果启动了本地线程分配缓冲,将按线程优先在TLAB上分配.少数情况下也可能会直接分配在老年代中,分配的规则并不是百分之百固定的,其细节取决于当前使用的是哪一种垃圾收集器组合,还有虚拟机中与内存相关的参数的设置. 本文中的内存分配策略指的是Serial / Serial Old收集器下(ParNew /

各种数据类型在jvm里的内存分配

jvm运行时数据区的简单介绍 JVM所管理的内存分为以下几个运行时数据区:程序计数器.Java虚拟机栈.本地方法栈.Java堆.方法区. 其中本文涉及到的主要有:java虚拟机站(简称java栈),java堆和方法区. 这里简单地普及一下这三种数据区的知识,java栈的读取速度是最快的(紧次与CPU的寄存器,跨平台性比寄存器好,android使用的是寄存器),但是里面的数据内存大小是编译时就已经分配好的,在运行时都不会改变:java堆的速度没有java栈的速度那么快,但是java堆里面的数据内存

深入理解jvm之一【内存区域】

文章开始之前,首先需要申明,本系列文章讨论的是HotSpot VM,文章中多数观点基于<深入理解Java虚拟机:JVM高级特性与最佳时间   周志明>,笔者如有理解错误,欢迎指正. 在开始探索jvm虚拟机之前,不得不对jvm的内存区域进行讨论,依旧先附上图表: 程序计数器 程序计数器,也能叫做PC寄存器,从名字上来理解可能会把它想成一个计数的内存区域,但是,了解汇编的人会知道,程序技术器实际上是CPU上的一个寄存器,它保存当前指令执行的地址(也可以说下一条指令所在的存储单元).当cpu执行该线

JVM学习之内存分配一

转自:http://blog.csdn.net/mazhimazh/article/details/16879055,多谢博主分享 我们知道计算机的基本构成是:运算器.控制器.存储器.输入和输出设备,那这个JVM也是有这成套的元素,运算器是当然是交给硬件CPU还处理了,只是为了适应“一次编译,随处运行”的情况,需要做一个翻译动作,于是就用了JVM指令集,这与汇编的命令集有点类似,每一种汇编命令集针对一个系列的CPU,比如8086系列的汇编也是可以用在8088上的,但是就不能跑在8051上,而JV

《深入理解Java虚拟机》内存分配策略

上节学习回顾 1.判断对象存活算法:引用计数法和可行性分析算法 2.垃圾收集算法:标记-清除算法.复制算法.标记-整理算法 3.垃圾收集器: Serial:新生代收集器,采用复制算法,单线程. ParNew:新生代收集器,采用复制算法,多线程. Parallel Scavenge:新生代收集器,采用复制算法,多线程,注重吞吐量. Serial Old:老年代收集器,采用标记-整理算法,单线程. Parallel Old:老年代收集器,采用标记-整理算法,多线程,与Parallel Scaveng

深入理解Java虚拟机笔记---内存分配与回收策略

Java技术体系中的自动内存管理最终可以归结为自动化地解决了两个问题:给对象分配内存以及回收分配给对象的内存.对象的内存分配往大的方向上讲,就是在堆上分配,对象主要分配在新生代的Eden区上,如果启动了本地线程分配缓冲(-XX:+UseTLAB,默认已开启),将按线程优先在TLAB上分配.少数情况下也可能会直接分配在老年代中,分配的规则并不是百分之百固定的,其细节取决于当前使用的是哪一种垃圾收集器组合,还有虚拟机中与内存相关的参数设置. 下面是几条主要的最普遍的内存分配规则: 1.对象优先在Ed

深入理解JVM(一)--Java 内存区域

一.  运行时数据区域 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域. Java虚拟机所管理的内存将会包括以下几个运行时数据区域:                                   1. 程序计数器 1)程序计数器(Program CounterRegister) 是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的行号指示器. 在虚拟机的概念模型里, 字节码解释器工作时就是通过改变这个计数器的值来选去吓一跳需要执行的字节码指

深入理解JVM(二)自动内存管理机制

2.1 C.C++内存管理是由开发人员管理,而Java则交给了JVM进行自动管理 2.2 JVM运行时数据区:方法区.堆(运行时线程共享),虚拟机栈.本地方法栈.程序计数器(运行时线程隔离,私有) 2.2.1 程序计数器(Program Counter Register):每一个线程都独有一个程序计数器,并且分配了一块线程私有的小块内存,程序运行时,这个计数器会记录字节码文件运行的行数,当线程切换时,则通过这个行数继续执行下面的操作 2.2.2 虚拟机栈(Java Virtual Machine

深入理解JVM——虚拟机GC

对象是否存活 Java的GC基于可达性分析算法(Python用引用计数法),通过可达性分析来判定对象是否存活.这个算法的基本思想是通过一系列"GC Roots"的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连时(图论称之为不可达),则证明此对象是不可用的. 无论引用计数法,还是可达性分析都离不开"引用"的概念.Java将引用分为四种(强引用.软引用,弱引用,虚引用),这四种引用强度依次逐渐减弱. s