java内存泄露原因_Java内存泄露的原因

java内存泄露原因_Java内存泄露的原因Java 内存泄露的原因 1 静态集合类像 HashMap Vector 等的使用最容易出现内存泄露 这些静态变量的生命周期和应用程序一致 所有的对象 Object 也不能被释放 因为他们也将一直被 Vector 等应用着 这种情况可以通过 removeclear 方式释放对象 没有问题 2 数据库的连接没有关闭情况 包括连接池方法连接数据库 如果没有关闭 ResultSet 等也都可能出现内存泄露的问题 这是代码中经

Java内存泄露的原因

1、静态集合类像HashMap、Vector等的使用最容易出现内存泄露,这些静态变量的生命周期和应用程序一致,所有的对象Object也不能被释放,因为他们也将一直被Vector等应用着。

这种情况可以通过remove clear方式释放对象,没有问题。

2、数据库的连接没有关闭情况,包括连接池方法连接数据库,如果没有关闭ResultSet等也都可能出现内存泄露的问题。

这是代码中经常出现的问题。

3、内部类和外部类的引用容易出现内存泄露的问题;监听器的使用,java中往往会使用到监听器,在释放对象的同时没有相应删除监听器的时候也可能导致内存泄露。

我认为此说法是不准确, 及时将对象设置为null可以加快内存回收,但并不代表内存不可达或者泄露,我们使用一个例子来验证下

packagetestawt;importjava.io.Console;importjava.util.Scanner;importjava.util.Vector;classperson

{publicString name;publicString age;privatehand handhello;publicperson ()

{

handhello=new hand(this);

}public voidsayhello()

{

handhello.Shake();

}public voidfinalize()

{

System.out.println(“gc person!”);

}

}classhand

{privateperson per;publichand(person per)

{this.per=per;

}public voidShake()

{

System.out.println(“Shake!”);

}public voidfinalize()

{

System.out.println(“gc hand!”);

}

}public classtestm {private staticScanner in;public static voidmain(String[] args)

{

Vector v = new Vector();for (int i = 1; i<20; i++)

{

person o= newperson();

v.add(o);

}

v.clear();

System.gc();//所有对象释放了

in = newScanner(System.in);int a =in.nextInt();for (int i = 0; i < 10; i++) System.out.println(a+i);

}

}

person和hand存在相互引用。但是强制调用gc ,能够回收内存。

gc person!

gc hand!

gc person!

gc hand!

gc person!

3、大量临时变量的使用,没有及时将对象设置为null也可能导致内存的泄露

我认为此说法不准确,及时将对象设置为null可以加快内存回收,但并不代表内存不可达或者泄露,如果你觉得自己使用了大量的临时变量,可以自己强制执行一次System.gc();

importjava.io.Console;importjava.util.Scanner;importjava.util.Vector;classperson

{publicString name;publicString age;publichand handhello;public voidfinalize()

{

System.out.println(“gc person!”);

}

}classhand

{public voidhello()

{

System.out.println(“hello!”);

}public voidfinalize()

{

System.out.println(“gc hand!”);

}

}classfooter

{public voidwalk()

{

System.out.println(“walk!”);

}public voidfinalize()

{

System.out.println(“gc footer !”);

}

}public classtestmain {private staticScanner in;public static voidmain(String[] args)

{//TODO Auto-generated method stub

Vector v = new Vector();for (int i = 1; i<20; i++)

{

person o= newperson();

o.handhello=newhand();

v.add(o);

footer f=newfooter();

f.walk();//o = null;

}

v.clear();

System.gc();//所有对象释放了

in = newScanner(System.in);int a =in.nextInt();for (int i = 0; i < 10; i++) System.out.println(a+i);

}

}

运行结果

gc footer !

gc hand!

gc person!

gc footer !

gc hand!

gc person!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/227957.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月16日 下午8:07
下一篇 2026年3月16日 下午8:08


相关推荐

  • Linux时间戳转换_如何获取时间戳

    Linux时间戳转换_如何获取时间戳#include<stdio.h>#include<time.h>intmain(){time_tt;//时间戳structtm*p;time(&t);//获取时间戳p=localtime(&t);//将时间戳转换为本地时间printf(“时间戳:%ld\n”,t);printf(“%d-%d-%d%d:%d:%d\n”,(1900+

    2022年10月2日
    4
  • mysql开启慢日志查询_MySQL慢sql检验生效

    mysql开启慢日志查询_MySQL慢sql检验生效MySQL给我们提供了一个很好的功能,那就是慢查询!所谓的慢查询就是通过设置来记录超过一定时间的SQL语句!那么如何应用慢查询呢?1.开启MySQL的慢查询日志功能默认情况下,MySQL是不会记录超过一定执行时间的SQL语句的。要开启这个功能,我们需要修改MySQL的配置文件:windows下修改my.ini,(注册表,计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentCo…

    2022年10月14日
    16
  • 【云原生 • DevOps】influxDB、cAdvisor、Grafana 工具使用详解

    【云原生 • DevOps】influxDB、cAdvisor、Grafana 工具使用详解掌握时间序列数据库 influxDB 容器监控工具 cAdvisor 图表工具 Grafana 的安装与使用

    2026年3月20日
    1
  • python安装pygame教程_python-pygame安装教程

    python安装pygame教程_python-pygame安装教程安装好python后,配置环境变量。安装pygame需要先配置两个环境变量。第一个是python的。先打开计算机,然后点击‘系统属性’然后点击‘高级系统设置’然后点击‘环境变量’在系统变量中找到path选择并编辑在末尾添加“;”号来作为与前面的间隔。我将python安装到了c盘的py文件夹所以我的安装目录是C:\py。(不要关闭编辑系统变量的界面,我们接着找第二个环境变量)第二个是pip的(我们…

    2022年5月23日
    40
  • Python 官方文档:入门教程

    Python 官方文档:入门教程

    2021年10月26日
    44
  • 螺旋矩阵题解

    螺旋矩阵题解螺旋矩阵 matrix cpp 问题描述 一个 n 行 n 列的螺旋矩阵可由如下方法生成 从矩阵的左上角 第 1 行第 1 列 出发 初始时向右移动 如果前方是未曾经过的格子 则继续前进 否则右转 重复上述操作直至经过矩阵中所有格子 根据经过顺序 在格子中依次填入 1 2 3 n2 便构成了一个螺旋矩阵 下图是一个 n 4 时的螺旋矩阵 nbsp 现给出矩阵大小 n 以及 i

    2026年3月17日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号