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. CDH 搭建 问题

    1.  问题描述: java.sql.SQLException: Access denied for user 'xxx'@'xxx.xxx.xxx.xxx' (using password: YES ...

  2. 【转】获取Jenkins构建时Git Change Log

    原文:https://www.jianshu.com/p/513ab6915dbd 在基于Jenkins进行CI持续集成的工作,在构建后上传蒲公英时想将本次版本的git commit信息同步到蒲公英的 ...

  3. 02-11Android学习进度报告十一

    今天我学习了BaseAdapter优化的知识,主要是View方面的优化. 首先是复用复用ConvertView 代码示例: @Override public View getView(int posi ...

  4. vue中加载three.js的gltf模型

    vue中加载three.js的gltf模型 一.开始引入three.js相关插件.首先利用淘宝镜像,操作命令为: cnpm install three //npm install three也行 二. ...

  5. stack的使用-Hdu 1062

    Text Reverse Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tota ...

  6. 《JavaScript高级程序设计》读书笔记(二)在html中使用JavaScript

    主要内容---使用<script>元素---嵌入脚本与外部脚本---文档模式对JavaScript的影响---考虑禁用JavaScript的场景 <script>元素---向h ...

  7. SQL SERVER 语法汇总

    一.基础 1.说明:创建数据库CREATE DATABASE database-name 2.说明:删除数据库drop database dbname3.说明:备份sql server--- 创建 备 ...

  8. 12 JavaScript String对象 & Date对象

    <script> var a = "string"; var b = new String("string"); var c = new Strin ...

  9. 安卓LED跑马灯 超炫酷的表白神器破解版

    链接:https://pan.baidu.com/s/11Wxll4iLdcEPq0wUBK6Ong 提取码:all4

  10. Python实现简单中文词频统计示例

    简单统计一个小说中哪些个汉字出现的频率最高: import codecs import matplotlib.pyplot as plt from pylab import mpl mpl.rcPar ...