java内存泄漏
发布日期:2021-06-20 05:37:13 浏览次数:10 分类:技术文章

本文共 2599 字,大约阅读时间需要 8 分钟。

java内存泄漏

  1. 静态集合类引起内存泄漏
/** * @program: 个人demo * @description: 内存泄露测试案例 * @author: Mr.Hu * @create: 2019-03-17 20:55 */public class OOM {
static List
list=new ArrayList<>(); public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
//添加对象后,将引用变量赋值为空 M_4 o=new M_4(); list.add(o); o=null; } for (M_4 o:list) {
System.out.println(o.i); } }}class M_4{
//单个内存为4M int[] a=new int[1024*1024]; double i=Math.random();}输出:0.339001389119942260.65529571956600720.056640088412603484

虽然引用变量被设置为null,但是那些对象还被集合引用着并且仍然可以使用。

要避免这种简单方法是集合赋值为null。

  1. 各种连接

比如数据库连接(dataSourse.getConnection()),网络连接(socket)和io连接,除非其显式的调用了其close() 方法将其连接关闭,否则是不会自动被GC 回收的。

这种情况下一般都会在try 里面去的连接,在finally里面释放连接。

  1. 单例模式中引用其它的对象

单例对象在初始化后将在 JVM 的整个生命周期中存在(以静态变量的方式实现的),如果单例对象持有外部的引用,那么这个对象将不能被 JVM 正常回收,导致内存泄漏

public class Single {
static int[] a=new int[1024*1024]; private static Single single=new Single(); //此处变量是static private Single(){
} Single getInstance(){
return single; }}

总结:

这些东西不会被回收也是因为可达性分析算法,算法里面可以作为GCroot的对象有

  1. Java虚拟机栈(栈帧中的本地变量表)中引用的对象
  2. 方法区中类静态属性引用的对象(比如单例模式、静态集合等)
  3. 方法区中常量引用的对象
  4. 本地方法栈中native方法引用的对象

附录:可以被回收的情况

public class OOM {
public static void main(String[] args) {
M_4 m=new M_4(); M_4 m2=new M_4(); M_4 m3=new M_4(); m=null;m2=null;m3=null; System.gc(); }}class M_4{
//单个内存为4M int[] a=new int[1024*1024]; double i=Math.random();}

Gc日志如下:

[GC (System.gc()) [PSYoungGen: 6280K->728K(9216K)] 14472K->8928K(19456K), 0.0018907 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] [Full GC (System.gc()) [PSYoungGen: 728K->0K(9216K)] [ParOldGen: 8200K->654K(10240K)] 8928K->654K(19456K), [Metaspace: 3458K->3458K(1056768K)], 0.0068374 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] Heap PSYoungGen      total 9216K, used 82K [0x00000000ff600000, 0x0000000100000000, 0x0000000100000000)  eden space 8192K, 1% used [0x00000000ff600000,0x00000000ff614920,0x00000000ffe00000)  from space 1024K, 0% used [0x00000000ffe00000,0x00000000ffe00000,0x00000000fff00000)  to   space 1024K, 0% used [0x00000000fff00000,0x00000000fff00000,0x0000000100000000) ParOldGen       total 10240K, used 654K [0x00000000fec00000, 0x00000000ff600000, 0x00000000ff600000)  object space 10240K, 6% used [0x00000000fec00000,0x00000000feca3a38,0x00000000ff600000) Metaspace       used 3464K, capacity 4500K, committed 4864K, reserved 1056768K  class space    used 377K, capacity 388K, committed 512K, reserved 1048576K

分析日志可以看出所有对象都被回收了!

转载地址:https://blog.csdn.net/h2453532874/article/details/88650359 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:二叉树专题 :翻转镜像、对称、遍历、所有路径
下一篇:LeetCode -Java 516. 最长回文子序列

发表评论

最新留言

表示我来过!
[***.240.166.169]2024年03月26日 10时42分46秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

【面试题目】Java设计模式你有哪些了解?说几个常用的。 2019-04-26
【计算机操作系统】常说的死锁是什么?死锁产生的必要条件是什么?死锁的解决策略是什么? 2019-04-26
【计算机操作系统】进程管理详解?进程与线程区别是什么?进程调度的算法有哪些?进程通信有哪些? 2019-04-26
【计算机操作系统】虚拟内存是什么?分页系统地址映射?页面置换算法有哪些?分段地址映射又是什么? 2019-04-26
【计算机操作系统】设备管理?磁盘结构是怎么样的?磁盘调度算法有哪些? 2019-04-26
【多线程高并发】为什么要使用多线程?创建多少个线程合适呢? 2019-04-26
【多线程与高并发】 Java两个线程轮流打印1-100两个数?多线程轮流打印数字? 2019-04-26
【多线程与高并发】 Java两个线程轮流打印字符串? 2019-04-26
【Linux命令篇】Linux命令实践 2019-04-26
【Leetcode单调队列】Leetcode239 滑动窗口最大值 2019-04-26
【Leetcode-单调栈】单调栈相关的题目-下一个更大的元素I 每日温度 2019-04-26
【Leetcode单调队列】- 洛谷P1714切蛋糕 2019-04-26
【Leetcode优先级队列】- 数据流的中位数 2021-06-29
【Leetcode优先级队列】-合并K个升序链表 2021-06-29
【多线程与高并发】-Java如何实现一个阻塞队列呢? 2021-06-29
【多线程高并发】-Java使用阻塞队列ArrayBlockingQueue实现生产者消费者模式? 2021-06-29
【多线程高并发】-多线程实现数组的读与写 2021-06-29
【Java设计者模式】-Java实现订阅-发布者模式 2021-06-29
【计算机操作系统】-什么是系统调用呢?什么是用户态?什么是内核态? 2021-06-29
【计算机操作系统-进程管理】-进程通信是什么呢? 2021-06-29