java虚拟机中的程序计数器区、虚拟机栈区、本地方法栈区3个区域是随着线程的创建而创建,随着线程的结束而结束时,内存自然得到回收,所以这三个区域不需要过多考虑内存的回收问题。

java虚拟机中的方法区和虚拟机堆区2个区是所有线程共享的区域,不同的接口或类需要的内存不同,且方法区和堆区往往是在程序运行期间进行内存动态分配或回收。GC回收器的使用范围就是对这两个区域的定义。

虚拟机堆区垃圾回收策略:
GC回收器在回收内存之前,首先要知道哪些对象可以回收,即“死去”的对象是可以回收的;哪些对象不能回收,即“存活”的对象是不能回收的,所以我们要弄明白
对象的“存活”或“死去”是怎么来判断的。
判断的策略:

1、引用计数算法:给对象中增加一个引用计数器,每当有引用此对象时,计数器加1,每当引用完毕后,计数器减1;如此计数器为0,则对象可以回收。
优点:简单,高效。
缺点:对互相引用的对象无法进行回收。
2、可达性分析算法:定义GCRoots(虚拟机栈中引用的对象、方法区中类静态属性引用的对象、方法区中常量引用对象、本地方法栈中引用的对象)为起始点,
从起始点开始向下搜索,搜索完毕,如果发现对象到GCroots无任何相连,则可将此对象作为可回收的对象。
GC收集器第一次发现某一对象不可达,并不会立即回收此对象,只是做一个不可达的标记,
引用计数器算法和可达性分析算法的基础都是对于对象引用的判断,引用是基础。
引用的分类:

1、强引用,GC收集器永不回收,直到引用不存在为止。
2、软引用,在系统内存溢出之前,将对这些对象进行内存回收。
3、弱引用,无论内存是否足够,都将回收此内存对象。
4、虚引用,系统会发出通知,回收此内存对象。

虚拟机方法区垃圾回收策略:
收集方法区中的常量:
收集方法区中的类:

收集条件:

1、该类所有的实例都已经被回收,也就是java堆中不存在改类的任何实例。
2、加载类的ClassLoader已经被回收
3、该类对应的java.lang.Class对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法。

垃圾收集算法:
1、标记-清除算法:首先通过引用可达性或者引用计数器的算法,标记出哪些对象已无引用,然后再对无引用的对象进行回收处理。
缺点:效率低,空间零碎
2、复制算法:将可用内存平均分为大小相等的两块,每次只使用一块,但此内存用完后,就将还存活的对象复制到另一块内存,把使用的那块全部回收。
商业上使用内存分为Eden区、两块Survivor区,每次只用Eden区和一块survivor区,当回收内存时,将Eden和使用的那块survivor区中还
存活的对象一次性的赋值到另一块survivor空间上,最后清理掉Eden和使用过的survivor空间,如果内存不足,则放置到永久带空间中。

3、标记-整理算法:在标记清楚算法基础上,回收完毕内存后,让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存。
4、分代收集算法:使用复制算法将新生代的内存进行回收,使用标记清理或标记整理算法将老年代的内存进行回收。

垃圾收集器:
1、Serial收集器。单线程收集器,采用复制算法,针对新生代,优点:简单高效,缺点:“stop the world"
2、ParNew收集器。多线程收集器,采用复制算法,针对新生代,优点:可以与CMS收集器配合工作(相同框架)
3、Parallel scavenge 收集器。多线程收集器,采用复制算法,针对新生代, 优点:可控吞吐量
4、CMS收集器。采用“标记-清除“算法,运行过程:初始标记,并发标记,重新标记,并发清除。优点:低停顿、并发收集 缺点:对CPU资源敏感、浮动垃圾无法一次处理、标记-清除算法碎片化内存
初始标记:标记GC Roots能直接关联到的对象,速度快。
并发标记:对GC Roots追踪
重新标记:修改并发标记期间,有变动的对象标记记录。
5、G1收集器。优点:通过并行与并发,使用多个cpu缩短stop the world停顿时间,并行是真正的同一时间多条指令同时执行,并发是同一时间段多条指令同时执行,同一时间只有一个指令在执行。
有分代收集的能力,不再需要其他收集器的配合。
空间整合。通过标记-整理算法、标记-复制算法,不存在内存碎片,收集后提供规整可用内存。
可预测的停顿。

JAVA虚拟机:内存回收策略及算法的更多相关文章

  1. 深入理解java虚拟机---内存分配策略(十三)

    转载请注明原文地址:https://blog.csdn.net/initphp/article/details/30487407 Java内存分配策略 使用的ParNew+Serial Old收集器组 ...

  2. Java虚拟机内存基础、垃圾收集算法及JVM优化

    1 JVM 简单结构图   1.1 类加载子系统与方法区 类加载子系统负责从文件系统或者网络中加载 Class 信息,加载的类信息存放于一块称 为方法区的内存空间.除了类的信息外,方法区中可能还会存放 ...

  3. 小白请教几个关于Java虚拟机内存分配策略的问题

    最近在看周志明所著的<深入理解Java虚拟机>,有几个问题不太明白,希望对虚拟机有研究的哥们儿帮我解答一下.先说一下我进行试验的环境: 操作系统:Mac OS X 10.11.6 EI C ...

  4. Java虚拟机垃圾回收:内存分配与回收策略 方法区垃圾回收 以及 JVM垃圾回收的调优方法

    在<Java对象在Java虚拟机中的创建过程>了解到对象创建的内存分配,在<Java内存区域 JVM运行时数据区>中了解到各数据区有些什么特点.以及相关参数的调整,在<J ...

  5. Java虚拟机内存模型及垃圾回收监控调优

    Java虚拟机内存模型及垃圾回收监控调优 如果你想理解Java垃圾回收如果工作,那么理解JVM的内存模型就显的非常重要.今天我们就来看看JVM内存的各不同部分及如果监控和实现垃圾回收调优. JVM内存 ...

  6. 探秘Java虚拟机——内存管理与垃圾回收

    本文主要是基于Sun JDK 1.6 Garbage Collector(作者:毕玄)的整理与总结,原文请读者在网上搜索. 1.Java虚拟机运行时的数据区 2.常用的内存区域调节参数 -Xms:初始 ...

  7. 探秘Java虚拟机——内存管理与垃圾回收(转)

    本文主要是基于Sun JDK 1.6 Garbage Collector(作者:毕玄)的整理与总结,原文请读者在网上搜索. 1.Java虚拟机运行时的数据区 2.常用的内存区域调节参数 -Xms:初始 ...

  8. JAVA虚拟机内存分配与回收机制

    Java虚拟机(Java Virtual Machine) 简称JVM Java虚拟机是一个想象中的机器,在实际的计算机上通过软件模拟来实现.Java虚拟机有自己想象中的硬件,如处理器.堆栈.寄存器等 ...

  9. Java虚拟机垃圾回收(二) :垃圾回收算法(转载)

    1.标记-清除算法 标记-清除(Mark-Sweep)算法是一种基础的收集算法. 1.算法思路 "标记-清除"算法,分为两个阶段: (A).标记 首先标记出所有需要回收的对象: 标 ...

随机推荐

  1. 【Html 页面布局】

    float:left方式布局 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /& ...

  2. python实现队列(queue)

    队列队列是一种先进先出的数据结构,主要操作包括入队,出队.入队的元素加入到对尾,从队头取出出队的元素.这里用列表简单模拟队列,其实现如下: queue()is_empty()size()enqueue ...

  3. SQL Server 消息队列,处理程序错误

    SQL Server 消息队列,处理程序错误存储过程书写错误,会导致消息处理队列停用,此时只需将错误修正,再将队列处理状态启用即可. ALTER QUEUE OrdBomPurQty_ReivceQu ...

  4. FastStone Capture 截图工具

    主要功能介绍 截屏 包括了全屏截取,当前活动窗口截取,截取选定区域,多边形截取和截取滚动页面等,基本上常用的都有了.特别是滚动截取,许多朋友为了这个功能,不惜安装各种重量级的截屏软件,甚至四处下载各种 ...

  5. 一文解读IBMS (转)

    IBMS系统是面向建筑设备生命周期的管理:面向楼宇的管理者和使用者:是传统BAS系统数据及功能的聚合. 更高效的分析和管理.更复杂的应用:跨平台.跨品牌的整合各子系统数据提供一套采集楼宇设备实时数据的 ...

  6. eclipse下用maven插件+Mabatis-generator生成mybatis的文件

    1. 配置Maven pom.xml 文件 在pom.xml增加以下插件: <build> </plugins> ... <plugin> <groupId& ...

  7. vue element 时间选择器设置禁用日期

    在 el-date-picker 组件中有一个 picker-options 属性 disabledDate 可以设置日期的可选范围 <el-date-picker v-model=" ...

  8. MFC TreeControl简单应用

    目录 1. TreeControl添加节点 2. TreeControl菜单 3. TreeControl修改节点 4. TreeControl查找节点 5. TreeControl折叠展开节点 6. ...

  9. 图像分割利用KMeans生成灰度图

    import numpy as np import PIL.Image as image from sklearn.cluster import KMeans def loadData(filePat ...

  10. HDU 5587:Array

    Array  Accepts: 118  Submissions: 232  Time Limit: 2000/1000 MS (Java/Others)  Memory Limit: 131072/ ...