这是面试中遇到的一个问题,今天大致简绍一下。
内存泄露:指的是无用的对象持续占用内存,的不到释放,造成内存的浪费
java中对象的创建采用new或者反射创建的,这些对象在堆中进行分配,其回收是由java虚拟机的回收机制完成的。垃圾回收机制,会监控每个对象的运行状况,对申请,引用,赋值,等状况进行监控。
回收标准:①给对象赋予了空值null,②给对象赋予了新值,这时候会重新进行分配空间。
泄露的原因:两种情况:
长生命周期的对象应用了生命周期较短的对象。
静态集合类的应用,如Hashmap和vector生命周期和程序是一样的。
为了避免内存泄露,在编写代码的过程中可以参考下面的建议:
1、尽早释放无用对象的引用;
2、使用字符串处理,避免使用String,应大量使用StringBuffer,每一个String对象都得独立占用内存一块区域;
3、尽量少用静态变量,因为静态变量存放在永久代(方法区),永久代基本不参与垃圾回收;
4、避免在循环中创建对象;
5、开启大型文件或从数据库一次拿了太多的数据很容易造成内存溢出,所以在这些地方要大概计算一下数据量的最大值是多少,并且设定所需最小及最大的内存空间值。
内存泄漏定位问题:
要定位问题,首先你需要获取服务器jvm某刻内存快照。jdk自带的jmap可以获取内存某一时刻的快照,导出为dmp文件后,就可以用Eclipse MAT来分析了,找出是那个对象使用内存过多。
参考文献:http://blog.csdn.net/gzh0222/article/details/8538727