目录

一.垃圾回收原理和算法

1.内存管理

2.垃圾回收过程

3.垃圾回收相关算法

二.通用的分代垃圾回收机制

1.年轻代

2.年老代

3.永久代

4.三种GC

三. JVM调优和Full GC

四.其他要点

五.开发中容易造成内存泄露的操作_垃圾回收知识总结

1.创建大量无用对象

2.静态集合类的使用

3.各种连接对象(I0流对象、数据库连接对象、网络连接对象)未关闭

4.监听器的使用


Java引入了垃圾回收机制,令C+ +程序负最头疼的内存管理问题迎刃而解。Java程序员可以将更多的精力放到业务逻辑上而不是内存管理工作上,大大的提高了开发效率。

1.垃圾回收过程一般分为两步,是哪两步?

答:(1)怎样发现垃圾 (2)回收
2.垃圾回收常见的两种算法是什么?

答:引用计数法,引用可达法(根搜索算法)
3.堆内存划分成:年轻代、年老代、永久代。垃圾回收器划分成: Minor GC,Major GC,FulIGC.这三种垃圾收回器都对应哪些区域?

答:Minor GC对应于年轻代,Major GC对应于年老代,FulIGC对应所有。
4.对JVM调优的过程中,很大一部分工作就是对于 Full GC的调节。这句话对吗?

答:对。
5. System.gc()的作用是什么?

答:建议启动垃圾回收线程。

一.垃圾回收原理和算法

1.内存管理

Java的内存管理很大程度指的就是:堆中对象的管理,其中包括对象空间的分配和释放。
对象空间的分配:使用new关键字创建对象即可。
对象空间的释放:将对象赋值null即可。垃圾回收器将负责回收所有”不可达"对象的内存空间。

2.垃圾回收过程

任何一种垃圾回收算法一般要做两件基本事情:
1.发现无用的对象
2.回收无用对象占用的内存空间。

垃圾回收机制保证可以将”无用的对象”进行回收。无用的对象指的就是没有任何变量引用该对象。Java 的垃圾回收器通过相关算法发现无用对象,并进行清除和整理。

3.垃圾回收相关算法

1.引用计数法
堆中的每个对象都对应一个引用计数器,当有引用指向这个对象时,引用计数器加1,而当指向该对象的引用失效时(引用变为null),引用计数器减1,最后如果该对象的引用计算器的值为0时,则Java垃圾回收器会认为该对象是无用对象并对其进行回收。优点是算法简单,缺点是“循环引用的无用对象”无法被识别。

2.引用可达法(根搜索算法)
程序把所有的引用关系看作一张图, 从一个节点GC ROOT开始,寻找对应的引用节点,找到这个节点以后,继续寻找这个节点的引用节点,当所有的引用节点寻找完毕之后,剩余的节点则被认为是没有被引用到的节点,即无用的节点。

二.通用的分代垃圾回收机制

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

1.年轻代

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

2.年老代

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

3.永久代

用于存放静态文件,如Java类、方法等。持久代对垃圾回收没有显著影响。JDK7以前就是“方法区”的一种实现。JDK8以后已经没有“永久代”了,使用metaspace元数据空间和堆替代。

4.三种GC

Minor GC:
用于清理年轻代区域。Eden 区满了就会触发一次Minor GC。清理无用对象,将有用对象复制到"Survivor1" 、"Survivor2" 区中。
Major GC:
用于清理年老代区域。
Full GC:
用于清理年轻代、年老代区域。成本较高, 会对系统性能产生影响。

三. JVM调优和Full GC

在对JVM调优的过程中,很大一部分工作就是对于 Full GC的调节。有如下原因可能导致Full GC:
1.年老代(Tenured) 被写满

2.持久代(Perm) 被写满

3. System.gc()被显示调用

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

四.其他要点

1.程序员无权调用垃圾回收器。
2.程序员可以调用System.gc(),该方法只是通知JVM,并不是运行垃圾回收器。尽量少用,会申请启动Full GC,成本高,影响系统性能。
3. finalize 方法,是Java提供给程序员用来释放对象或资源的方法,但是尽量少用。

五.开发中容易造成内存泄露的操作_垃圾回收知识总结

在实际开发中,经常会造成系统的崩溃。如下这些操作我们应该注意这些使用场景。

如下四种情况时最容易造成内存泄露的场景:

1.创建大量无用对象

比如,我们在需要大量拼接字符串时,使用了String而不是StringBuilder.

eg:

String str= "";
for (inti= 0;i < 10000; i++) {str += i;//相当于产生了10000个String对象
}

2.静态集合类的使用

像HashMap、Vector、 List等的使用最容易出现内存泄露,这些静态变量的生命周期和应用程序一致, 所有的对象Object也不能被释放。

3.各种连接对象(I0流对象、数据库连接对象、网络连接对象)未关闭

IO流对象、数据库连接对象、网络连接对象等连接对象属于物理连接,和硬盘或者网络连接,不使用的时候一定要关闭。

4.监听器的使用

释放对象时,没有删除相应的监听器

百无聊赖之JavaEE从入门到放弃(四)垃圾回收机制(Garbage Collection)相关推荐

  1. 百无聊赖之JavaEE从入门到放弃(二)基础语法

    目录 一.注释(单行,多行,文档) 二.标识符_关键字_驼峰原则 三.bug解决:Welcome.java:6: 错误: 编码GBK的不可映射字符 四.常量constant 五.数据类型 1.整型 2 ...

  2. 百无聊赖之JavaEE从入门到放弃(五)this的本质_对象创建过程的4 步_隐式参数 static

    目录 一.this关键字 1.对象创建的过程和this的本质 2.this最常的用法: 二.static关键字 三.变量分类 一.this关键字 1.对象创建的过程和this的本质 构造方法是创建Ja ...

  3. 百无聊赖之JavaEE从入门到放弃(十二)数组

    目录 一.基础知识 1.数组的定义 2.建议 3.注意 4.数组的默认初始化 二.基操示例代码 三.拷贝 四.Arrays类 一.基础知识 1.数组的定义 数组是相同类型数据的有序集合.数组描述的是相 ...

  4. 百无聊赖之JavaEE从入门到放弃(七)继承

    目录 一.继承 1.继承使用要点 二.instanceof关键字 三.方法的重写(override) 四.final关键字 五.组合 定义啥的就不说了,说说要点,跑跑代码. 一.继承 1.继承使用要点 ...

  5. 百无聊赖之JavaEE从入门到放弃(三)JVM内存机制

    一.从属于线程的内存区域 JVM的内存划分中,有部分区域是线程私有的,有部分是属于整个JVM进程;我们将这部分归为一类. 1.程序计数器(Program Counter Register) 在JVM规 ...

  6. 百无聊赖之JavaEE从入门到放弃(六)包机制 静态导入

    一.包机制 包机制是Java中管理类的重要手段.开发中, 我们会遇到大量同名的类,通过包我们很容易对解决类重名的问题,也可以实现对类的有效管理. 包对于类,相当于文件夹对于文件的作用. 我们通过pac ...

  7. 百无聊赖之JavaEE从入门到放弃(九)封装详解 多态详解

    目录 一.封装 1.封装的作用和含义 2.编程中封装的具体优点: 3.封装的实现一使用访问控制符 4.关于protected的两个细节: 5.开发中封装的简单规则 6.javaBean 二.多态(po ...

  8. 百无聊赖之JavaEE从入门到放弃(十)抽象方法_抽象类 接口

    目录 一.abstract 1.抽象方法 2.抽象类 3.抽象类的使用要点 4.示例代码 二.接口 1.接口是什么 2.接口的作用 3.区别 4.格式 (1)声明格式: (2)定义接口的详细说明 (3 ...

  9. 百无聊赖之JavaEE从入门到放弃(十一)string类 常量池原理 内部类

    目录 一.String类和常量池 1.String基础知识 2.常量池 二.内部类 1.概念 2.内部类的作用 3.注意 4.非静态内部类 5.静态内部类 6.匿名内部类 7.局部内部类 一.Stri ...

最新文章

  1. shell脚本编写乘法口诀
  2. “ u”到底是做什么的? “ git push -u原始主机”与“ git push原始主机”
  3. CSDN如何自动生成目录
  4. caffe windows学习:第一个测试程序
  5. html树形多选下拉列表,EasyUI 多行树形下拉框(Multiple ComboTree)_Vue EasyUI Demo
  6. InnoDB的ib_logfile写入策略
  7. PostgreSQL-PL/pgSQL
  8. (转)Akka学习笔记
  9. Linux中对文件描述符的操作(FD_ZERO、FD_SET、FD_CLR、FD_ISSET
  10. 初学计算机语言者(C语言,C++,java,pytion,C#)
  11. mask rcnn属于dnn么_基于OpenCV DNN的 MaskRCNN 目标检测与实例分割
  12. java编码native2ascii下载_使用native2ascii 中文字符与Unicode编码相互转换
  13. 情侣博客,我也想做一个。
  14. Access-培训管理系统-03-建个数据库
  15. BLOCK层代码分析(1)数据的组织BIO
  16. mysql 视图 中文_Mysql视图-WEB资讯专栏-DMOZ中文网站分类目录-免费收录各类优秀网站的中文网站目录....
  17. Python课程设计大作业:获取比赛数据并进行机器学习智能预测NBA的比赛结果
  18. 永远不要在MySQL中使用UTF-8
  19. DICOM:开源DICOM服务框架DCM4CHE 安装
  20. 计算机网络-计算机网络的定义及分类

热门文章

  1. Android游戏预约榜,最强游戏手机预定?ROG新机曝光,全面超越安卓跑分性能榜...
  2. 计算机专业马来西亚,关于马来西亚大学里的计算机专业,你知道多少?
  3. 摆摊江湖:用数据思维拆解摆摊经济
  4. Android 框架练成 教你打造高效的图片加载框架
  5. 华为p20 安装Charles证书步骤
  6. Disneyland of Shanghai
  7. 推陈、致新——城市更新促进美丽城市建设
  8. Docker - 卷 - 数据持久化
  9. 管理远程桌面信息的三种好用的管理工具
  10. blender python运动模糊 ob对象尺寸