内存泄露本质:长生命周期的对象持有了短生命周期的对象的引用。
减少内存泄露风险方式:
1.单例模式。 单例模式一般都是全局静态持有,所以需要注意,尽量不要在单例中持有大对象。
2.遇到大对象的时候,用完及时设为null。
3.对象尽可能的减小其生命周期。
4.I/O流用完一定要关闭。如文件流、socket流、数据库连接等
5.引用类型的数组中某个元素不再需要的时候,一定要设为null
下面为可能会出现内存泄露的代码:
1.使用HashSet集合的情况。由于set是不重复的,更新操作会先通过hashcode来查找,然后通过equels来判断是否相等。
默认hashcode 和equels方法: 在更新类中的字段值,不会造成内存泄露
重写hashcode 和equels方法: 重写后这两个方法一般都是随着类中的字段值hashcode也跟随着变化,在删除更新后的对象时,可能会造成内存泄露(hashcode变化,找不到该对象了)
public class SetMemLeak { private final static Set<Stock> stockSet = new HashSet<Stock>(); public static void main(String[] args) { Stock stock1 = new Stock("300059.SZ", 12.5f, 13.1f); Stock stock2 = new Stock("600000.SH", 23.5f, 43.1f); int beforeHashcode = stock1.hashCode(); stockSet.add(stock1); stockSet.add(stock2); int beforeSize = stockSet.size(); stock1.setPclose(132.1f); // int afterHashcode = stock1.hashCode(); System.out.println("before:" + beforeHashcode + ";after:" + afterHashcode); //没有覆写: before:200012267;after:200012267 //覆写后输出: before:1057581966;after:1086057358 stockSet.remove(stock1); //如果覆写equels 和hashcode方法, 这里将导致内存泄露 int afterSize = stockSet.size(); System.out.println("before size:" + beforeSize + ";after size:" + afterSize); //没有覆写: before size:2;after size:1 //覆写后输出: before size:2;after size:2 } } class Stock { private String stockCode; private float price; private float pclose; public Stock(String stockCode, float price, float pclose) { this.stockCode = stockCode; this.price = price; this.pclose = pclose; } public String getStockCode() { return stockCode; } public void setStockCode(String stockCode) { this.stockCode = stockCode; } public float getPrice() { return price; } public void setPrice(float price) { this.price = price; } public float getPclose() { return pclose; } public void setPclose(float pclose) { this.pclose = pclose; } @Override public boolean equals(Object o) { if (this == o) return true; if (!(o instanceof Stock)) return false; Stock stock = (Stock) o; if (Float.compare(stock.pclose, pclose) != 0) return false; if (Float.compare(stock.price, price) != 0) return false; if (stockCode != null ? !stockCode.equals(stock.stockCode) : stock.stockCode != null) return false; return true; } @Override public int hashCode() { int result = stockCode != null ? stockCode.hashCode() : 0; result = 31 * result + (price != +0.0f ? Float.floatToIntBits(price) : 0); result = 31 * result + (pclose != +0.0f ? Float.floatToIntBits(pclose) : 0); return result; } }
2
相关推荐
内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的...
31、java 中会存在内存泄漏吗,请简单描述。 11 32、abstract 的method 是否可同时是static,是否可同时是native,是否可同时是synchronized? 11 33、静态变量和实例变量的区别? 11 34、是否可以从一个static 方法...
内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的...
82_Netty引用计数原子更新揭秘与AtomicIntegerFieldUpdater深度剖析 83_AtomicIntegerFieldUpdater实例演练与volatile关键字分析 84_Netty引用计数注意事项与内存泄露检测方式 85_Netty编解码器剖析与入站出站处理器...
目录 Android 学习文档总结 ................... 1 DevDiv 推荐资源 ........................ 2 Windows 8 ..............................................................iOS .......................................
84_Netty引用计数注意事项与内存泄露检测方式 85_Netty编解码器剖析与入站出站处理器详解 86_Netty自定义编解码器与TCP粘包拆包问题 87_Netty编解码器执行流程深入分析 88_ReplayingDecoder源码分析与特性解读 89_...
84_Netty引用计数注意事项与内存泄露检测方式;85_Netty编解码器剖析与入站出站处理器详解;86_Netty自定义编解码器与TCP粘包拆包问题;87_Netty编解码器执行流程深入分析;88_ReplayingDecoder源码分析与特性解读;...
Android的主题和风格介绍,Android开发环境搭建,Android内存泄露调试,Android日历完整实现,Android摄像头的应 用,Android实现GPS定位,Android通过JNI调用驱动程序,Android网络开发详解,android写的google map api ...
Android的主题和风格介绍,Android开发环境搭建,Android内存泄露调试,Android日历完整实现,Android摄像头的应 用,Android实现GPS定位,Android通过JNI调用驱动程序,Android网络开发详解,android写的google map api ...
第84讲:Netty引用计数注意事项与内存泄露检测方式 第85讲:Netty编解码器剖析与入站出站处理器详解 第86讲:Netty自定义编解码器与TCP粘包拆包问题 第87讲:Netty编解码器执行流程深入分析 第88讲:...
<BR>3、常见异常实例包括:数组下标越界,算法溢出(超出数值表达范围),除数为零,无效参数、内存溢出异常处理功能:主要处理一些同步异常(除数为0),不宜处理一些异步事件(Disk I/O End、网络信息到达、点击...
31、java 中会存在内存泄漏吗,请简单描述。 11 32、abstract 的method 是否可同时是static,是否可同时是native,是否可同时是synchronized? 11 33、静态变量和实例变量的区别? 11 34、是否可以从一个static 方法...
在访问量比较大的情况下,可以不用担心发生内存泄露的情况. 配置一个creator的创建和远程方法调用设置: <param name="class" value="java.util.Date"/> ... 上面的配置信息表示将java.util.date提供给客户端...
在新的编程思想中,指针基本上被禁止使用(JAVA中就是这样),至少也是被限制使用。而在我们交换机的程序中大量使用指针,并且有增无减。 2、防止指针/数组操作越界 【案例1.2.1】 在香港项目测试中,发现ISDN话机...
修改XP风格支持库,解决GDI资源泄露,以及在使用通用组件库六时组合框标题出现重影的BUG。 5. 修改扩展界面支持库一,解决树形框项目无法通过鼠标点击进入编辑状态的BUG。 6. 修改高级表格支持库,解决插入行/...