Java 内存泄露以及避免方法
发布日期:2021-07-01 01:41:57
浏览次数:2
分类:技术文章
本文共 1120 字,大约阅读时间需要 3 分钟。
转载自
内存泄露:
是指在程序运行过程中会不断的分配内存空间,那些不再使用的内存空间应该即时回收它们,从而保证可以保证系统可以再次使用这些内存。如果存在无用的内存没有被收回来,那就是内存泄露。说明: 对于数组的操作,堆和栈的操作需要慎重的考虑是否存在内存泄露(出栈时没有清理最后一个元素即没有对最后一个元素置空)
垃圾回收机制: a. 跟踪并监控每个java对象,当某个对象处于不可达的状态时,就回收该对象所占用的内存。 b. 清理内存分配、回收过程中产生的内存碎片。 避免内存泄露的小技巧a. 尽量使用直接量,对于Byte、Short、Integer、Long、Float、Double、Bolean、Character程序不应该使用new 方式创建对象,而采用直接量创建它们。
b. 使用StringBuilder和StringBuffer进行字符串连接 Sting和StringBuilder以及StringBuffer等都可以代表字符串,其中String字符串代表的是不可变的字符串,后两者表示可变的字符串。如果使用多个String对象进行字符串连接运算,在运行时可能产生大量临时字符串,这些字符串会保存在内存中从而导致程序性能下降。
c. 尽量少使用静态变量 类的静态变量的生命周期和类同步的。在类不被卸载的情况下,类对应类对象会常驻内存,知道程序运行结束。 如下代码就会存在内存泄露问题:class Person { static Object obj = new Object(); }
d.避免在经常调用的方法、循环中创建Java对象。
e. 缓存经常使用的对象 如果有些对象需要经常被用到,可以考虑把这些对象用缓存池保存起来,下次用的时候直接从池中拿。典型的就是数据连接池。 如果系统中还有一些常用的基础信息,可以考虑用缓存,实现缓存的方式有如下两种: (1) 使用HashMap进行缓存。 (2) 直接使用某些开源的缓存项目。说明:缓存设计本身就是一直以牺牲系统空间来换取运行时间的技术。
f. 考虑使用SoftReference 当程序需要创建长度很大的数组时,可以考虑使用SoftReferene来包装数组元素,而不是直接让将数组元素来引用对象。此时SoftReference是个很好的选择:当内存足够时,它的功能等同于普通引用;当内存不足时,它会牺牲自己,释放软引用所引用的对象。 注意:由于软引用引用对象的不确定性(软引用所获取的对象可能为null),所以程序取出SoftReference所引用的Java之后,应该显式判断该对象是否为null; 当该对象为null时,应该重建该对象。转载地址:https://maokun.blog.csdn.net/article/details/80660749 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
第一次来,支持一个
[***.219.124.196]2024年04月14日 14时59分35秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
CentOS下以RPM方式安装MySQL5.5
2019-05-02
linux下MySQL安装及设置
2019-05-02
centos7下快速安装mysql
2019-05-02
当root权限失去某些权限后,如何恢复这个权限?
2019-05-02
将当前时间戳转化为 struct tm 结构 然后获取自己想要的数据
2019-05-02
protobuf在网络编程中的应用思考
2019-05-02
Centos 7 开启端口
2019-05-02
SHELL字符串处理技巧(${}、##、%%)
2019-05-02
C/C++之回调函数
2019-05-02
c++回调函数 callback
2019-05-02
类的静态成员函数带来了什么好处,应该在什么时候使用?
2019-05-02
使用Python开发微信公众号
2019-05-02
python 微信公众平台开发
2019-05-02
游戏数据库服务器 数据缓存 增量更新
2019-05-02
游戏数据库服务器
2019-05-02
将mysql中查询出来的数据 序列化到protobuffer消息结构体中
2019-05-02
mysql存取二进制数据
2019-05-02
linux netstat 统计连接数查看外部
2019-05-02
C++模板
2019-05-02