zoukankan      html  css  js  c++  java
  • Java的内存回收

    一、java引用的种类

    1、对象在内存中的状态

    可达状态:当一个对象被创建后,有一个以上的引用变量指向它。

    可恢复状态:

    不可达状态:当对象的所有关联被切断,且系统调用所有对象的finalize方法依然没有使该对象变成可达状态,那该对象将永久性的失去所有引用,最后变成不可达状态。

    2、引用的类型

    强引用:

    软引用:

    弱引用:

    虚引用:

    二、java的内存泄露

    三、垃圾回收机制

    1、垃圾回收算法

    串行(Serial)回收和并行(Parallel)回收:串行是始终只有一个CPU在执行垃圾回收操作;并行是把整个回收工作拆分成多个部分,每一部分由一个CPU负责,从而让多个CPU并行回收。并行回收效率高,但复杂度增加,内存碎片增加。

    并发(Concurrent)执行和应用程序停止(Stop-the-world):

    压缩(Compacting)、不压缩(Non-Compacting)和复制(Copying):为了减少内存碎片,支持压缩的垃圾回收器会把所有的活动对象搬迁到一起,然后将之前占用的内存全部回收。不压缩的垃圾回收只会回收内存,这样回收来的内存不是连续的,造成内存碎片。不压缩的相对于压缩式的,回收比较快,但内存分配慢。复制的垃圾回收会把所有的可达对象拷贝到另一块相同的内存中,优点是垃圾回收过程中不会产生内存碎片,缺点是需要复制数据和额外的内存。

    标记清除(mark-sweep):不压缩

    标记压缩(mark-sweep-compact):压缩式

    2、堆内存的分代回收

    yong:

    old:

    permanent:

    3、与垃圾回收的附加选项

    -Xmx:java虚拟机堆内存的最大容量

    -Xms:初始容量

    -XX:MinHeapFreeRatio=40

    -XX:MaxHeapFreeRatio=70

    -XX:NewRatio=2

    -XX:NewSize=64m

    -XX:SurvivalRatio=8

    -XX:MaxNewSize=128m

    -XX:PermSize=128m

    -XX:MaxPermSize=128m

    4、常见的垃圾回收器

    串行回收器:yong,串行复制;old,串行标记压缩

    并行回收器:

    并行压缩回收器(Parallel Compacting Collector):

    并发标记-清理(mark-sweep)回收器:

    四、内存管理的小技巧

    1、尽量使用直接量;

    String str="hello world";

    String str=new String("hello world");

    2、使用StringBuilder和StringBuffer进行字符串连接;

    3、尽早释放无用对象的引用;

    obj=null;

    4、尽量少用静态变量;

    与类的生命周期同步。

    5、避免在经常调用、循环的方法中创建对象;

    6、缓存经常使用的对象;

    牺牲系统空间换取运行时间

    7、尽量不要使用finalize方法;

    在对象失去引用之后,垃圾回收器回收该对象之前,垃圾回收机制会先调用该对象的finalize方法进行资源清理。

    8、考虑使用SoftReference;

  • 相关阅读:
    If选择结构
    三元运算符
    顺序结构
    键盘输入使用
    逻辑运算符
    关系运算符
    自增自减运算符
    《黑客与画家》阅读笔记1
    周总结1
    2020年秋季个人阅读计划
  • 原文地址:https://www.cnblogs.com/esther-qing/p/6694041.html
Copyright © 2011-2022 走看看