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. 【原】cookie和session的区别

    1.存放位置 cookie的数据存放在客户端的浏览器上,session存放在服务器上 2.安全程度 cookie不是很安全,别人通过分析本地的cookie并进行cookie欺骗:考虑到安全应该使用se ...

  2. iOS 开发之 生产者与消费者模式及其实现

    概念: 在工作中,大家可能会碰到这样一种情况:某个模块负责产生数据,这些数据由另一个模块来负责处理(此处的模块是广义的,可以是类.函数.线程.进程等).产生数据的模块,就形象地称为生产者:而处理数据的 ...

  3. HDU 1372 Knight Moves(bfs)

    嗯... 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1372 这是一道很典型的bfs,跟马走日字一个道理,然后用dir数组确定骑士可以走的几个方向, ...

  4. 通过js检测浏览器支持的字体,从而显示支持的字体,让用户选择。

    http://www.zhangxinxu.com/wordpress/2018/02/js-detect-suppot-font-family/ 本文根据张鑫旭文章. 字体函数: var dataF ...

  5. pikachu-字符型注入(get) #手工注入

    1.检测注入类型 http://127.0.0.1/pikachu-master/vul/sqli/sqli_str.php?name=1&submit=%E6%9F%A5%E8%AF%A2 ...

  6. 5-2 使用antDesign的Table 及 modal(对话情景框) 功能

    1,进入antDesign官网,粘贴table代码 2,看代码各个部分实现什么功能,根据需求改代码 表格类似如下: 代码如下: const columns = [ { title: 'Name', d ...

  7. Linux--info命令 ,help命令,man命令(帮助)

    Info和man命令一样都是帮助类文件 Info文件不仅包含信息,而且还包含连接到其他info文件的链接. 如何使用info显示希望的内容 * 如何操纵Info系统 * 如何显示Info的帮助信息. ...

  8. 学习笔记(2)- BioBERT

    Jinhyuk Lee, Wonjin Yoon, Sungdong Kim, Donghyeon Kim, Sunkyu Kim, Chan Ho So, Jaewoo Kang, BioBERT: ...

  9. tcp连接建立和断开

    TCP协议作为传输层主要协议之一,具有面向连接,端到端,可靠的全双工通信,面向字节流的数据传输协议. 1.TCP报文段 虽然TCP面试字节流,但TCP传输的数据单元却是报文段.TCP报文段分为TCP首 ...

  10. iOS Common Design Patterns:常用设计模式

    原文:http://www.jianshu.com/p/bf431fff235e 我们经常在编程中使用各种设计模式,在iOS中比较常见的设计模式有:单例模式.委托模式.观察者模式,当然实际上在Coco ...