垃圾回收原理和算法

内存管理

  Java的内存管理很大程度指的就是对象的管理,其中包括对象空间的分配和释放。

  对象空间的分配:使用new关键字创建对象即可

  对象空间的释放:将对象赋值null即可

垃圾回收器将负责回收所有”不可达”对象的内存空间

垃圾回收过程

  任何一种垃圾回收算法一般要做两件基本事情:

  1. 发现无用的对象

  2. 回收无用对象占用的内存空间。

垃圾回收相关算法

1. 引用计数法

堆中每个对象都有一个引用计数。被引用一次,计数加1. 被引用变量值变为null,则计数减1,直到计数为0,则表示变成无用对象。优点是算法简单,缺点是“循环引用的无用对象”无法别识别。

2. 引用可达法(根搜索算法)


通用的分代垃圾回收机制

分代垃圾回收机制,是基于这样一个事实:不同的对象的生命周期是不一样的。因此,不同生命周期的对象可以采取不同的回收算法,以便提高回收效率。我们将对象分为三种状态:年轻代、年老代、持久代。JVM将堆内存划分为 Eden、Survivor 和 Tenured/Old 空间。

1. 年轻代

           所有新生成的对象首先都是放在Eden区。 年轻代的目标就是尽可能快速的收集掉那些生命周期短的对象,对应的是Minor GC,每次 Minor GC 会清理年轻代的内存,算法采用效率较高的复制算法,频繁的操作,但是会浪费内存空间。当“年轻代”区域存放满对象后,就将对象存放到年老代区域。

2. 年老代

          在年轻代中经历了N(默认15)次垃圾回收后仍然存活的对象,就会被放到年老代中。因此,可以认为年老代中存放的都是一些生命周期较长的对象。年老代对象越来越多,我们就需要启动Major GC和Full GC(全量回收),来一次大扫除,全面清理年轻代区域和年老代区域。

  3. 持久代

         用于存放静态文件,如Java类、方法等。持久代对垃圾回收没有显著影响

Minor GC:

  用于清理年轻代区域。Eden区满了就会触发一次Minor GC。清理无用对象,将有用对象复制到“Survivor1”、“Survivor2”区中(这两个区,大小空间也相同,同一时刻Survivor1和Survivor2只有一个在用,一个为空)

  Major GC:

  用于清理老年代区域。

  Full GC:

  用于清理年轻代、年老代区域。 成本较高,会对系统性能产生影响。

垃圾回收过程:

1、新创建的对象,绝大多数都会存储在Eden中,

2、当Eden满了(达到一定比例)不能创建新对象,则触发垃圾回收(GC),将无用对象清理掉,

然后剩余对象复制到某个Survivor中,如S1,同时清空Eden区

3、当Eden区再次满了,会将S1中的不能清空的对象存到另外一个Survivor中,如S2,

同时将Eden区中的不能清空的对象,也复制到S2中,保证Eden和S1,均被清空。

4、重复多次(默认15次)Survivor中没有被清理的对象,则会复制到老年代Old(Tenured)区中,

5、当Old区满了,则会触发一个一次完整地垃圾回收(FullGC),之前新生代的垃圾回收称为(minorGC)


 JVM调优和Full GC

在对JVM调优的过程中,很大一部分工作就是对于Full GC的调节。有如下原因可能导致Full GC:

  1.年老代(Tenured)被写满

  2.持久代(Perm)被写满

  3.System.gc()被显式调用(程序建议GC启动,不是调用GC)

  4.上一次GC之后Heap的各域分配策略动态变化


开发中容易造成内存泄露的操作

注:在实际开发中,内存泄露经常会造成系统的崩溃。

1. 程序员无权调用垃圾回收器。

  2. 程序员可以调用System.gc(),该方法只是通知JVM,并不是运行垃圾回收器。尽量少用,会申请启动Full GC,成本高,影响系统性能。

  3. finalize方法,是Java提供给程序员用来释放对象或资源的方法,但是尽量少用。

java知识点8——垃圾回收原理和算法、通用的分代垃圾回收机制、 JVM调优和Full GC、开发中容易造成内存泄露的操作相关推荐

  1. JVM 调优 2:GC 如何判断对象是否为垃圾,三色标记算法应用原理及存在的问题?

    文章目录 前言 一.如何判断一个对象是否为垃圾? 1.1.reference count(引用计数) 1.2.reference count(引用计数)存在的问题 二.Root Searching(根 ...

  2. java垃圾回收 分代_Java-垃圾回收机制-通用的分代垃圾回收机制

    分代垃圾回收机制是基于这样一个事实:不同的对象的生命周期是不一样的.因此,不同生命周期的对象可以采取不同的回收算法,以便提高回收效率.Java虚拟机将对象分为三种状态:年轻代.年老代.持久代.JVM将 ...

  3. 67.Java垃圾收集机制\对象引用\垃圾对象的判定\垃圾收集算法\标记—清除算法\标记—整理算法\分代收集\垃圾收集器\性能调优

    67.Java垃圾收集机制 67.1.对象引用 67.2.垃圾对象的判定 67.3.垃圾收集算法 67.3.1.标记-清除算法 67.3.2.标记-整理算法 67.3.3.分代收集 67.4.垃圾收集 ...

  4. vector java 复制_Java性能优化必知的40个细节(珍藏版):Jvm调优+MySQL+Tomcat

    在JAVA程序中,性能问题的大部分原因并不在于JAVA语言,而是程序本身.养成良好的编码习惯非常重要,能够显著地提升程序性能.文末有整理好的相关面试文件,可以免费获取. 性能优化的50个细节 1. 尽 ...

  5. heap c语言数组实现,垃圾回收算法实现之 - 分代回收(完整可运行C语言代码)...

    分代垃圾回收(Mark-Sweep GC),并不是一个具体的算法,只是结合了几种垃圾回收算法,把对象按特点进行了分类,对每种特点的对象集执行不同的回收算法,从而提升回收效率 阅读本文之前,你最好已经了 ...

  6. Java虚拟机jvm 调优总结

    一.相关概念 基本回收算法 引用计数(Reference Counting) 比较古老的回收算法.原理是此对象有一个引用,即增加一个计数,删除一个引用则减少一个计数.垃圾回收时,只用收集计数为0的对象 ...

  7. Java虚拟机这一块 —— JVM 调优和深入了解性能优化

    JVM 调优和深入了解性能优化 JVM 调优的本质 GC 调优原则 调优的原则 目的 GC 调优 调优步骤 日志分析 阅读 GC 日志 -XX:+UseSerialGC -XX:+UseParNewG ...

  8. 一般的Java项目需要JVM调优吗?

    一般是不需要的,JVM调优是最后的手段. 1.调优原则 JVM调优听起来很高大上,但是要认识到,JVM调优应该是Java性能优化的最后一颗子弹. 比较认可廖雪峰老师的观点,要认识到JVM调优不是常规手 ...

  9. Java 性能优化系列之3.2[JVM调优]

    实用JVM参数 1. JIT 编译参数 JIT(Just-In-Time)编译器, 可以在运行时将字节码编译成本地代码,从而提升函数的执行效率. -XX:CompileThreshold为 JIT编译 ...

最新文章

  1. Garbage First
  2. 关于量子计算机 (3)
  3. “蓝桥杯”基础练习:01字串
  4. 携程在线风控系统架构
  5. 几款强大的 Pandas 数据探索工具,推荐收藏使用
  6. 设计模式 建造者模式_设计模式:建造者
  7. rto初始化和计算_TCP系列15—重传—5、Linux中RTO的计算
  8. azure blob_如何在Azure Blob存储中恢复意外删除
  9. 牛客题霸-SQL篇——10~20题
  10. 国外android手机刷机国内,哪些中国安卓用户最爱刷机?
  11. matlab 时钟日历教程,Flash制作电子日历时钟教程
  12. xbee模块和单片机_XBee® ZigBee 模块使用方法
  13. 5g局域网传输速度_4G5G和上网带宽与下载速度的换算方法
  14. 台式机安装双系统win10+Ubuntu
  15. (转)实用Word使用技巧大全
  16. c语言API用法 查询
  17. MySQL 并集、交集、差集
  18. 【DaVinci Developer专题】-38-Exclusive Area介绍+配置
  19. nz-upload 文件上传 - Angular
  20. 谷歌广告联盟怎么收款?推荐使用招商银行电汇秒到账

热门文章

  1. EZ 2018 07 06 NOIP模拟赛
  2. Win10系列:JavaScript 的 WinJS库
  3. spring装载配置文件失败报错:org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException...
  4. struts2处理.do后缀的请求
  5. SVN Access Manager 0.5.5.14 发布 - SVN 管理工具
  6. CEikEdWin 类的使用
  7. c#(winform)中ComboBox和ListBox添加项完全解决
  8. rosdep init和rosdep update出错处理
  9. Google首席软件工程师Joshua Bloch谈如何设计一款优秀的API【附PPT】
  10. 微软宣布推出Windows Embedded Compact 2013正式版