• 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;

  • 相关阅读:
    【转】机器学习算法一览,应用建议与解决思路
    机器学习笔记04(Logistic Regression)
    机器学习笔记03(Classification: Probabilistic Generative Model)
    机器学习笔记00(课程结构)
    .Net PE
    wpf 画五角星函数
    .Net Core CLR FileFormat Call Method( Include MetaData, Stream, #~)
    天子守国门,君王死社稷
    CoreCLR Host源码分析(C++)
    Core CLR Host 源码简单分析
  • 原文地址:https://www.cnblogs.com/esther-qing/p/6694041.html
Copyright © 2020-2023  润新知