垃圾回收机制

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

  1. 发现无用的对象(没有任何变量引用该对象)
  2. 回收无用对象占用的内存空间

垃圾回收相关算法: 引用计数法, 引用可达法

分代垃圾回收机制: 不同的对象的生命周期是不一样的. 因此, 不同生命周期的对象可以采用不同的回收算法, 以便提高回收效率. 将对象分为三种状态: 年轻代, 年老代, 持久代. JVM虚拟机将堆划分为Eden, Survivor和Tenured/Old空间

年轻代

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

年老代

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

持久代

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

Minor GC: 用于清理年轻代区域. Eden区满了就会触发一次Minor GC.清理无用对象, 将有用对象复制到"Survivor1", "Survivor2"区中(这两个区大小相同, 同一时刻两者只有一个在用, 另一个为空)

Major GC: 用于清理年老代区域

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

垃圾回收过程:

  1. 新创建的对象, 绝大多数都会存储在Eden中
  2. 当Eden满了(到达一定比例)不能创建新对象, 则触发垃圾回收(GC), 将无用对象清理掉, 然后剩余对象复制到某个Survivor中, 同时清空Eden区
  3. 当Eden区再次满了, 会将Survivor中不能清空的对象存到另一个Survivor中
  4. 重复多次(默认15次)Survivor中没有被清理的对象, 则会复制到年老代Old(Tenured)区中
  5. 当Old区满了, 就会触发一个一次完整的垃圾回收(Full GC), 之前新生代的垃圾回收称为(minor GC)

垃圾回收机制关键点:

垃圾回收机制只回收JVM堆内存里的对象空间

对其他物理连接, 比如数据库连接, 输入流输出流, Socket连接无能为力

现在的JVM有多种垃圾回收实现算法, 表现各异

垃圾回收发生具有不可预知性, 程序无法精确控制垃圾回收机制执行

可以将对象的引用变量设置为null, 暗示垃圾回收机制可以回收该对象

程序员可以通过System.gc()或者Runtime.getRuntime().gc()来通知系统进行垃圾回收, 会有一些效果, 但是系统是否进行垃圾回收依然不确定

垃圾回收机制回收任何对象之前, 总会先调用它的finalize方法(如果覆盖该方法, 让一个新的引用变量重新引用该对象, 则会重新激活对象)

永远不要主动调用某个对象的finalize方法, 应该交给垃圾回收机制调用

易造成内存泄漏的操作

创建大量无用对象

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

String str = --;

for(int = 0; i < 10000; i++) {

str += i; // 相当于产生了10000个String对象

}

静态集聚合类的使用

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

各种连接对象(IO流对象, 数据库连接对象, 网络连接对象)未关闭

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

监听器的使用

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

Java_垃圾回收机制(未掌握)的更多相关文章

  1. Java内存分配及垃圾回收机制(未完待待续)

    Java内存区域 1.内存区域 jvm运行时数据区域 程序计数器 Java虚拟机栈 本地方法栈 方法区 Java堆 大图 2.概念解释 程序计数器   线程私有的一块很小的内存空间,它是当前线程所执行 ...

  2. 【Java_基础】JVM内存模型与垃圾回收机制

    1. JVM内存模型 Java虚拟机在程序执行过程会把jvm的内存分为若干个不同的数据区域来管理,这些区域有自己的用途,以及创建和销毁时间. JVM内存模型如下图所示 1.1 程序计数器 程序计数器( ...

  3. .net垃圾回收机制编程调试试验

    1. 什么是CLR GC? 它是一个基于引用跟踪和代的垃圾回收器. 从本质上,它为系统中所有活跃对象都实现了一种引用跟踪模式,如果一个对象没有任何引用指向它,那么这个对象就被认为是垃圾对象,并且可以被 ...

  4. java垃圾回收机制

    1 .垃圾回收机制(GC)垃圾回收就是回收内存中不再使用对象:(1)垃圾回收的步骤:1)查找内存中不再使用的对象:2)释放这些对象所占用的内存:(2)查找内存中不再使用的对象方法:1)引用计数法如果一 ...

  5. 垃圾回收机制GC知识再总结兼谈如何用好GC

    一.为什么需要GC 应用程序对资源操作,通常简单分为以下几个步骤: 1.为对应的资源分配内存 2.初始化内存 3.使用资源 4.清理资源 5.释放内存 应用程序对资源(内存使用)管理的方式,常见的一般 ...

  6. 【转】深入理解 Java 垃圾回收机制

    深入理解 Java 垃圾回收机制   一.垃圾回收机制的意义 Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再 ...

  7. Python的垃圾回收机制

    Python的GC模块主要运用了“引用计数”(reference counting)来跟踪和回收垃圾.在引用计数的基础上,还可以通过“标记-清除”(mark and sweep)解决容器对象可能产生的 ...

  8. Java Garbage Collection基础详解------Java 垃圾回收机制技术详解

    最近还是在找工作,在面试某移动互联网公司之前认为自己对Java的GC机制已经相当了解,其他面试官问的时候也不存在问题,直到那天该公司一个做搜索的面试官问了我GC的问题,具体就是:老年代使用的是哪中垃圾 ...

  9. 深入理解java垃圾回收机制

    深入理解java垃圾回收机制---- 一.垃圾回收机制的意义 Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再 ...

随机推荐

  1. [论文理解] Good Semi-supervised Learning That Requires a Bad GAN

    Good Semi-supervised Learning That Requires a Bad GAN 恢复博客更新,最近没那么忙了,记录一下学习. Intro 本文是一篇稍微偏理论的半监督学习的 ...

  2. Java知识系统回顾整理01基础06数组06二维数组

    一.一维数组和二维数组 这是一个一维数组, 里面的每一个元素,都是一个基本类型int int a[] =new int[]{1,2,3,4,5}; 这是一个二维数组,里面的每一个元素,都是一个一维数组 ...

  3. 深入浅出具有划时代意义的G1垃圾回收器

    G1诞生的背景 Garbage First(简称G1)收集器是垃圾收集器技术发展历史上的里程碑式的成果,它开创了收集器面向局部收集的设计思路和基于Region的内存布局形式.HotSpot开发团队最初 ...

  4. mysql字段大小写敏感设置

    mysql中varchar类型的字符集一般设置成utf8,然而mysql默认是对大小写不敏感(不区分),如果想要mysql区分大小写需要设置排序规则,规则详解如下:在mysql中存在着各种排序规则:1 ...

  5. docker-创建容器常见选项

    1. docker run创建容器常见选项 1.1 创建容器 选项 描述 -i,-interactive 交互式 -t,-tty 分配一个伪终端 -d,-detach 运行容器到后台 -e,-env ...

  6. ARM-Linux S5PV210 UART驱动(转)

    ARM-Linux S5PV210 UART驱动(3)----串口核心层.关键结构体.接口关系 尽管一个特定的UART设备驱动完全可以按照tty驱动的设计方法来设计,即定义tty_driver并实现t ...

  7. CentOS 7的安装与部署 01

    01 虚拟软件的安装与配置 虚拟机(Virtual Machine)指通过软件模拟的具有完整硬件系统功能的.运行在一个完全隔离环境中的完整计算机系统.在实体计算机中能够完成的工作在虚拟机中都能够实现. ...

  8. 【学习笔记】陀螺 Treap

    以下来自一堆人从食堂走回机房时的 yy \(\Huge{强烈谴责\ \mathrm{s\color{red}{kyh}}\ 看博客不留评论的行为}\) 听说 longdie 要爆砍 FHQ 无旋 Tr ...

  9. docker下安装kafka和kafka-manager

    1.下载镜像 这里使用了wurstmeister/kafka和wurstmeister/zookeeper这两个版本的镜像 docker pull wurstmeister/zookeeper doc ...

  10. spring boot:thymeleaf给fragment传递参数的方法(spring boot 2.3.3)

    一,thymeleaf如何给fragment传递参数? 1,如果是全局的参数,可以用interceptor中传递 非全局参数,可以从controller中传递 2,引用片断时也可以传递参数 说明:刘宏 ...