• Java_垃圾回收机制(未掌握)


    垃圾回收机制

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

    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提供给程序员来释放对象或资源的方法, 但是尽量少使用
  • 相关阅读:
    Stacks And Queues
    Programming Assignment 5: Burrows–Wheeler Data Compression
    Data Compression
    Regular Expressions
    Programming Assignment 4: Boggle
    Oracle 查询表的索引包含的字段
    pycharm
    Java文件:追加内容到文本文件
    okhttp 使用response.body().string()获取到的数据是一堆乱码
    彻底解决unable to find valid certification path to requested target
  • 原文地址:https://www.cnblogs.com/hesper/p/9694710.html
Copyright © 2020-2023  润新知