Java内存回收、泄漏以及性能优化
来源:互联网 发布:php素数 编辑:程序博客网 时间:2024/06/05 04:01
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,应放在循环最外层
- Java内存回收、泄漏以及性能优化
- Java垃圾回收机制以及内存泄漏
- Java垃圾回收机制以及内存泄漏
- Java 性能优化(防止内存泄漏)
- 性能优化(内存泄漏)
- 性能优化(内存泄漏)
- 性能优化—内存泄漏
- Android性能优化-内存泄漏
- Android性能优化 --- 内存泄漏
- 性能优化1-内存泄漏
- Java内存模型及性能优化及Java垃圾回收
- Android 性能优化之内存泄漏检测以及内存优化(上)
- Android 性能优化之内存泄漏检测以及内存优化(下)
- JAVA 内存泄漏 垃圾回收 两篇
- Java的内存回收之内存泄漏与垃圾回收
- Android性能优化与内存泄漏分析
- Android性能优化-内存泄漏1
- Android性能优化-内存泄漏2
- 3.10
- intent flag 解析
- Maven 手动添加 JAR 包到本地仓库
- 素数线性筛选法
- Binary Indexed Tree树状数组初步 & USACO2011 November Gold Above the Median
- Java内存回收、泄漏以及性能优化
- 怎么通过反射的方式获取指定变量名称的值呢?比如说一个const类型的常量:const string aa=123
- 改变线程优先级:
- NOI2.2基本算法之递归和自调用函数 2的幂次方表示 分析
- matplotlib绘图实例:pyplot、pylab模块及作图参数
- test
- Xshell学习笔记
- react-native 组件demo
- EasyPermissions解决Zxing扫一扫6.0权限问题