垃圾回收机制

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

  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. Python中matplotlib.pyplot.imshow画灰度图的多种方法

    转载:https://www.jianshu.com/p/8f96318a153f matplotlib库的教程和使用方法此处就不累赘了,网上有十分多优秀的教程资源.此处直接上代码: def demo ...

  2. 用ASP创建API。NET Core (Day2):在ASP中创建API。网络核心

    下载PDF article - 1.5 MB 下载source - 152.4 KB 下载source - 206.3 KB 下载source code from GitHub 表的内容 中间件路线图 ...

  3. 用Python爬取B站、腾讯视频、爱奇艺和芒果TV视频弹幕!

    众所周知,弹幕,即在网络上观看视频时弹出的评论性字幕.不知道大家看视频的时候会不会点开弹幕,于我而言,弹幕是视频内容的良好补充,是一个组织良好的评论序列.通过分析弹幕,我们可以快速洞察广大观众对于视频 ...

  4. 《我想进大厂》之Redis夺命连环11问

    这是面试题系列第三篇--redis专题. 说说Redis基本数据类型有哪些吧 字符串:redis没有直接使用C语言传统的字符串表示,而是自己实现的叫做简单动态字符串SDS的抽象类型.C语言的字符串不记 ...

  5. 使用AirtestProject+pytest做支付宝小程序UI自动化测试

    一,前言 1,背景 因公司业务需要做支付宝小程序的UI自动化测试,于是在网上查找小程序的自动化资料,发现微信小程序是有自己的测试框架的,但几乎找不到支付宝小程序UI自动化测试相关的资料.白piao失败 ...

  6. 左叶子之和(sum-of-left-leaves)

    LeetCode题目--左叶子之和(sum-of-left-leaves) 计算给定二叉树的所有左叶子之和. 示例: 3 / \ 9 20 / \ 15 7 在这个二叉树中,有两个左叶子,分别是 9 ...

  7. 55.Qt-将界面程序封装成静态库

    1.生成dll 然后选择创建静态链接库: 创建的时候,记得勾选QtGui,并且修改pro文件,添加下面1句(这样就可以创建界面了): 修改staticlib.cpp: #include "s ...

  8. 3.字符设备led驱动

    1.硬件原理图 由图可知,led1,led2,led3,led4,分别对应GPB5,GPB6,GPB7,GPB8,由s3c2440芯片手册可得到如下图所示,分别配置GPBCON和GPBDAT即可 2. ...

  9. 洛谷 P4819 [中山市选]杀人游戏(tarjan缩点)

    P4819 [中山市选]杀人游戏 思路分析 题意最开始理解错了(我太菜了) 把题意简化一下,就是找到可以确定杀手身份的最小的危险查看数 (就是不知道该村名的身份,查看他的身份具有危险的查看数量),用 ...

  10. 如何从0到1的构建一款Java数据生成器-第二章

    前提 在上一章我们提到了并且解决了几只拦路虎,承上启下,下面我们一起来实现一款数据生成器. 对外API /** * @description: 本地数据生成API * @author: peter * ...