Java内存回收、泄漏以及性能优化

释放双眼,带上耳机,听听看~!

Java内存管理包括内存分配和内存回收。都是由JVM自动完成的,对于JVM的垃圾回收机制来说,是否回收一个对象的标准在于:是否还有引用变量引用该对象,有就不回收,没有就回收。

一、Java引用和内存回收之间的关系

1.对象的三种状态:

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

(2)可恢复状态:对象不再有任何引用变量引用它,它将先进入可恢复状态。

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

2.Java四种引用:

(1)强引用:当一个对象呗一个或者一个以上的强引用变量所引用时,它处于可达状态,不能被系统垃圾回收机制回收,由于JVN肯定不会回收强引用所引用的对象,因此强引用是造成JAVA内存泄露的主要原因之一。

(2)软引用:当系统内空间不足时,被软引用所引用的Java对象可以被垃圾回收机制回收,从而避免内存不足的异常,当陈旭需要大量创建某个类的新对象而且有可能重新访问已创建的老对象时可以充分使用软引用来解决内存紧张的难题。

(3)弱引用:当系统垃圾回收机制运行时,不管系统内存是否足够,总会回收该对象所占用的内存。

(4)虚引用:主要用于跟踪对象被垃圾回收的状态,不能单独使用,虚引用必须和引用队列联合使用。

二、Java内存泄漏

程序运行中会不断分配内存空间,不再使用的的内存空间应该及时回收它们,从而保证系统可以再次使用这些内存,如果存在无用的内存没有被回收回来,那就是内存泄漏。

三、内存管理技巧

1.尽量使用直接量:String str = "hello";

2.使用StringBuilder和StringBuffer进行字符串连接。

3.尽早释放无用对象的引用

4.尽量少用静态变量

5.避免在机场调用的方法、循环中创建Java对象

6.缓存经常使用的对象

7.尽量不要使用finalize:将资源清理放在finalize()方法中完成是非常拙劣的选择。

8.考虑使用SoftReference:当程序需要创建长度很大的数组时。

四、性能优化:(其实也是对上一点的补充)

1.在合适的场合使用单例

2.避免过多的创建Java对象

3.尽量使用final修饰符

4.慎用synchronized,尽量减小synchronized方法

5.在finally块中释放资源

6.多线程在未发生线程安全前提下应尽量使用HashMap、ArrayList

7.减少对变量的重复计算,不要重复初始化变量

8.尽量用位移来代替“a/b”的操作

9.慎用异常

10.不要在循环中使用Try/Catch,应放在循环最外层

给TA打赏
共{{data.count}}人
人已打赏
安全技术

Bootstrap 间隔 (Spacing)

2021-12-21 16:36:11

安全技术

从零搭建自己的SpringBoot后台框架(二十三)

2022-1-12 12:36:11

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索