标记清除法:

分为两个阶段,标记----清除

标记阶段将所有需要回收的对象做标记,然后在清除阶段将所有的标记对象回收

但是这种回收方法有很大的缺点,那就是这两个过程的的效率并不高,两个过程都是效率很低的过程

另外一个缺点就是标记清除之后,因为之前并没有移动对象,每个标记的对象在空间的各个位置,清除

之后会有很多不连续的内存,在遇到需要分配一个比较大的对象的时候,会出现虽然总量上有空间容纳,

但实际上因为这些内存不连续无法分配一个连续的较大的内存给这个较大对象的情况,而导致系统再次

触发一次GC

复制算法:

复制算法是将空间分为两个大小相等的部分,每次只使用其中的一块,然后这一块用完之后就将自己里面的

还存活着的对象复制到另一块里面去,这样的好处就是清除之后产生的内存不会出现不连续的情况,但缺点

也很明显,那就是需要将内存缩小一半,这样看来这种代价太大,所以之后的复制算法在这上面做出改进,将

内存分为了三个区域,一个Eden区域和两个survivor区域(大小为8/1/1,值得提醒的是这里所说的都是新生代),

将在回收时将Eden区域和其中一个survivor中的存活的对象复制到另一个survivor中,然后将这这两个清理,

相比于1/1的那种复制,显然这种只浪费1/10的的空间,那么这里要问了,其实我当时也提出了这样的问题,假如

存活对象是大于survivor的,那该怎么办,书上给了解释就是需要依赖其他内存来作为担保.细节先不谈,还有就是

这种复制算法,在存活对象比较多的情况下,比如老年代,效率自然就变低.所以产生了接下来这种算法

标记整理算法:

这算法之前的步骤跟第一个标记清除一样,将对象一一标记,但之后不同的是不对对象进行处理,而是将存活对象向一端移动

然后清理另一边的内存,这种算法更适用于老年代

分代收集:

其实就是因地制宜思想,在新生代这种会有大量对象死去的时候,采用复制算法,因为需要复制的内存少,而在老年代

就采用标记清理或者标记整理

垃圾收集器

收集算法不止一种,自然收集器也肯定不止一种,不同的收集器作用的范围不同,所采用的算法也不同

如果将作用范围划分为新生代和老年代的话:

连线代表两者能搭配使用,所处区域代表作用范围

依照书上画了一张简易的草图来了解这些收集器的作用范围,然后一一细说

Serial收集器

作用域:新生代

采用的收集算法:新生代Serial采用复制算法,老年代SerialOld采用标记整理

特点:单线程收集器,在进行收集的时候,需要暂停其他所有工作线程(Stop the world),简单高效,对于桌面应用场景(新生代使用内存不大)是很好的选择

缺点:在用户不可见的情况下将用户的工作线程都停掉,对其他应用造成影响

ParNew收集器

作用域:新生代

算法:新生代复制算法,老年代复制整理算法

特点:是Serial的多线程版本,其余跟Serial一样,是设置-XX:+UserConcMarksSweepGC参数默认的收集器

通过设置jvm参数为-XX:+UserParNewGC来强制使用

只有以上两种能与后面出现的并发收集器(CMS)同时工作

Parallel Scavenge收集器

作用域:新生代

采用的收集算法:复制算法

特点:多线程收集,关注点跟其他不同,他的目标是得到一个可以控制的吞吐量,即高效利用CPU时间,而其他则是尽可能缩短用户线程的停顿时间,即有良好的相应速度提升用户体验

ps:吞吐量是指运行用户代码时间/(运行用户代码时间和垃圾收集时间)

Serial Old收集器

作用域:老年代

算法:标记整理算法

特点:两大用途,一是jdk1.5之前和与ParallelScavenge一起用,另外就是作为CMS的后备方案

Parallel Old收集器

作用域:老年代

特点:注重吞吐量和CPU资源

CMS收集器(ConcurrentMarkSweep)

作用域:老年代

算法:标记清除算法

特点:以获取最短回收停顿时间为目标

四个过程:初始标记(标记GCroot能直接关联到的对象,GC管理的主要区域是堆,所以方法区,栈,本地方法区这些不被GC管理的区域的对象一般用于做GCRoots),

并发标记(GC root Tracing),重新标记(修正因为用户操作而标记有变动的对象的标记记录),并发清除,收集过程可以和用户线程并发执行

缺点:-对CPU资源敏感,所以在跟用户进程并发执行的过程中会占用CPU资源导致应用程序变慢,吞吐量降低

-无法处理浮动的垃圾,即在运行过程中产生的垃圾(收集过程中用户进程没有停止,所以垃圾还在产生)

-标记清除,会造成空间碎片化,在大的对象产生时候内存分配会遇到麻烦

G1收集器

作用域:

算法:整体标记整理局部复制算法

特点:四大特点:

1,并行与并发,G1能利用多CPU多核心的硬件优势,来缩短STW的时间

2,分代收集

3,空间整合,上面所说的CMS的缺点就是空间碎片化,而G1采用整体标记整理局部复制算法的方法来使得空间的碎片化情况得到解决

4,可预测的停顿,建立了可以预测的停顿时间的模型,能让使用者明确指定一个长度为M毫秒的时间片段内,消耗在垃圾收集上的时间不得超过N毫秒

感觉这部分知识还需要慢慢啃,一下子搬上来概念或者概述也没啥用...

java垃圾收集方法_java几种垃圾收集方法和垃圾收集器相关推荐

  1. Java动态代理的两种实现方法:JDK动态代理和CGLIB动态代理

    Java动态代理的两种实现方法:JDK动态代理和CGLIB动态代理 代理模式 JDK动态代理 CGLIB动态代理 代理模式 代理模式是23种设计模式的一种,指一个对象A通过持有另一个对象B,可以具有B ...

  2. 用java实现云计算的两种趋势性方法

    本文讲的是用java实现云计算的两种趋势性方法,[IT168 资讯]最近,人们在思考如何使用Java来实现云计算,我看到了两种趋势性的方法.它们存在交叉重叠处而并非互相排斥,但总体而言它们在项目方面有 ...

  3. java单例的几种实现方法

    java单例的几种实现方法: 方式1: public class Something { private Something() {}private static class LazyHolder { ...

  4. java 登录过滤_Java 过滤器实现(登录) + 拦截器(两种方法)

    以下是实现未登录不能进入页面的实现 使用了thyemeleaf+SpringBoot+过滤器实现的,过滤器的核心代码如下: @Component @WebFilter(filterName= &quo ...

  5. java中断线程_Java中断线程的方法

    使用interrupt()中断线程 当一个线程运行时,另一个线程可以调用对应的Thread对象的interrupt()方法来中断它,该方法只是在目标线程中设置一个标志,表示它已经被中断,并立即返回.这 ...

  6. java基础深入_java编程基础之方法深入

    大纲 方法入门 概述 前讲解的循环操作,可以解决的是代码重复的问题,但是此时的重复的代码必须是有规律的.那循环操作,能解决所有的代码重复吗?答案肯定是不行的,比如针对于某一种功能的重复操作,循环就无法 ...

  7. java get 空指针_Java 中空指针处理方法

    空指针异常(Null Pointer Exception)是我们平时最容易碰到的,也是最令人讨厌的异常.本文介绍如何避免出现空指针异常. 首先我们看如下的示例: private Boolean isF ...

  8. java tostring方法_Java虚拟机如执行方法调用的(二)?

    虚方法调用 Java里所有非私有实例方法调用都会被编译成invokevirtual指令. 接口方法调用都会被编译成invokeinterface指令.这两种指令都属于Java虚方法的调用. 在大多数情 ...

  9. java set排序_Java Set排序的方法

    Java Set排序的方法 Set中TreeSet 本身就是有序的元素,那么下面重点介绍下HashSet的2种排序方法. 1. 把HashSet保存在ArrayList里,再用Collections. ...

  10. java复制对象_JAVA对象复制的方法

    1.概述 在实际编程过程中,我们常常要遇到这种情况:有一个对象A,在某一时刻A中已经包含了一些有效值,此时可能 会需要一个和A完全相同新对象B,并且此后对B任何改动都不会影响到A中的值,也就是说,A与 ...

最新文章

  1. pyspark dataframe数据连接(join)、转化为pandas dataframe、基于多个字段删除冗余数据
  2. 在编写flash游戏播放声音时的一个要注意的地方
  3. 批量合并同一文件夹下工作簿-1
  4. TortoiseGit客户端的ssh密钥配置
  5. pywin32、win32api、win32gui、win32com、win32con 都是啥?
  6. 亿豪的python学习 day14
  7. 动态指针时钟:利用pyqt5制作指针钟表显示实时时间
  8. 计算机安全模式什么意思,什么是电脑安全模式 电脑怎么解除安全模式
  9. python绘图小dome
  10. c++获取umg ue_[UE4]UMG widget Property Binding(属性绑定),事件触发蓝图函数和C++函数...
  11. 项目实战总结以及接入U-APM
  12. pdo mysql 教程_PDO入门教程
  13. D7100 调节白平衡
  14. IdentityServer4系列(05)【授权方式】
  15. 浙江农林大学ACM集训队2019级队长退役回忆录(未实际退役版本)
  16. 用input标签 文件,多文件上传
  17. 搜索引擎优化大师的SEO总结
  18. 计算机信息系统安全的概论,信息安全概论
  19. Kubernetes 最新版本安装过程和注意事项
  20. python .net web开发对比_Python与C#/.NET——在使用Python开发大型web应用程序时,需要考虑哪些关键区别?...

热门文章

  1. IO流使用示例,字符流文件拷贝demo
  2. 抛物线交点式公式_二次函数顶点式、交点式、两根式概念解读
  3. STM32:关于DMA,TCM(ITCM和DTCM)和Cache的理解
  4. 变量案例弹出用户名(JS)
  5. input 禁止输入特殊字符
  6. JavaScript:执行机制
  7. PCL之计算点云质心---pcl::compute3DCentroid()
  8. PCL之点云可视化--CloudViewer
  9. linux进程管理相关概念
  10. sed个人习惯用法总结