Java的内存回收

Posted esther-qing

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;

 

以上是关于Java的内存回收的主要内容,如果未能解决你的问题,请参考以下文章

Java内存回收机制

Java内存与垃圾回收篇(对象内存与垃圾回收机制)上篇

Java如何分配和回收内存?Java垃圾收集器如何工作?

Java内存空间的分配及回收

java垃圾回收机制简介

Java中垃圾回收有啥目的?啥时候进行垃圾回收?