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. Python与线性代数——Numpy中的matrix()和array()的区别

    Numpy中matrix必须是2维的,但是 numpy中array可以是多维的(1D,2D,3D····ND).matrix是array的一个小的分支,包含于array.所以matrix 拥有arra ...

  2. 【快学springboot】SpringBoot整合Mybatis Plus

    原创声明 本文首发于头条号[Happyjava].Happy的掘金地址:https://juejin.im/user/5cc2895df265da03a630ddca,Happy的个人博客:http: ...

  3. PAT A1103 Integer Factorization

    线性dfs,注意每次深搜完状态的维护~ #include<bits/stdc++.h> using namespace std; ; vector<int> v,tmp,pat ...

  4. PTA的Python练习题(四)

    从 第3章-1 3-1.大于身高的平均值 开始 1. 引入列表的概念 a=list(map(int,input().split())) b=sum(a) c=len(a) d=b/c for i in ...

  5. 学习笔记(16)- InsuranceQA_zh

    仓库地址:https://github.com/l11x0m7/InsuranceQA_zh Convolutional Neural Network for Chinese InsuranceQA ...

  6. sprintf 、vsprintf 、_vsntprintf

    转载:https://blog.csdn.net/anye3000/article/details/6593551 sprintf函数的定义为: int sprintf(char *szBuffer, ...

  7. 【PAT甲级】1027 Colors in Mars (20 分)

    题意: 输入三个范围为0~168的整数,将它们从十三进制转化为十进制然后前缀#输出. AAAAAccepted code: #define HAVE_STRUCT_TIMESPEC #include& ...

  8. 分支预测(branch prediction)

    记录一个在StackOverflow上看到一个十分有趣的问题:问题. 高票答案的优化方法: 首先找到罪魁祸首: if (data[c] >= 128) sum += data[c]; 优化方案使 ...

  9. 代码审计变成CTF

    0x01 代码审计中的信息收集 一个cms代码量确实不少,通读代码耗时长,效果也不一定好.而一个功能点如果之前出过漏洞,特别是多次出现漏洞的地方,证明开发者对这个漏洞的理解不充分,很容易再次绕过补丁. ...

  10. 引入CSS的方式、link和@import的区别

    引入CSS的方式有四种:内联方式.嵌入方式.链接方式.导入方式. 内联方式 内联方式指的是直接在 HTML 标签中的 style 属性中添加 CSS. <div style="back ...