Java内存泄露的原因
Java内存泄露的原因
1、静态集合类像HashMap、Vector等的使用最容易出现内存泄露,这些静态变量的生命周期和应用程序一致,所有的对象Object也不能被释放,因为他们也将一直被Vector等应用着。
这种情况可以通过remove clear方式释放对象,没有问题。
2、数据库的连接没有关闭情况,包括连接池方法连接数据库,如果没有关闭ResultSet等也都可能出现内存泄露的问题。
这是代码中经常出现的问题。
3、内部类和外部类的引用容易出现内存泄露的问题;监听器的使用,java中往往会使用到监听器,在释放对象的同时没有相应删除监听器的时候也可能导致内存泄露。
我认为此说法是不准确, 及时将对象设置为null可以加快内存回收,但并不代表内存不可达或者泄露,我们使用一个例子来验证下
package testawt; import java.io.Console;
import java.util.Scanner;
import java.util.Vector; class person
{
public String name;
public String age;
private hand handhello;
public person ()
{
handhello=new hand(this);
}
public void sayhello()
{
handhello.Shake();
}
public void finalize()
{
System.out.println("gc person!");
}
}
class hand
{
private person per;
public hand(person per)
{
this.per=per;
}
public void Shake()
{
System.out.println("Shake!");
}
public void finalize()
{
System.out.println("gc hand!");
}
} public class testm { private static Scanner in;
public static void main(String[] args)
{
Vector<person> v = new Vector<person>();
for (int i = 1; i<20; i++)
{
person o = new person();
v.add(o);
}
v.clear();
System.gc();
//所有对象释放了
in = new Scanner(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();
import java.io.Console;
import java.util.Scanner;
import java.util.Vector; class person
{
public String name;
public String age;
public hand handhello;
public void finalize()
{ System.out.println("gc person!");
} }
class hand
{
public void hello()
{
System.out.println("hello!");
}
public void finalize()
{
System.out.println("gc hand!");
}
} class footer
{
public void walk()
{
System.out.println("walk!");
}
public void finalize()
{
System.out.println("gc footer !");
}
} public class testmain { private static Scanner in; public static void main(String[] args)
{
// TODO Auto-generated method stub
Vector<person> v = new Vector<person>(); for (int i = 1; i<20; i++)
{
person o = new person();
o.handhello=new hand();
v.add(o); footer f=new footer();
f.walk();
//o = null;
}
v.clear();
System.gc();
//所有对象释放了
in = new Scanner(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!
Java内存泄露的原因的更多相关文章
- Java内存泄露原因详解
一.Java内存回收机制 不论哪种语言的内存分配方式,都需要返回所分配内存的真实地址,也就是返回一个指针到内存块的首地址.Java中对象是采用new或者反射的方法创建的, 这些对象的创建都是在堆(He ...
- Java 内存泄露
一.Java内存回收机制 不论哪种语言的内存分配方式,都需要返回所分配内存的真实地址,也就是返回一个指针到内存块的首地址.Java中对象是采用new或者反射的方法创建的,这些对象的创建都是在堆(Hea ...
- java内存泄露与内存溢出
内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory: 内存泄露 memory leak,是指程序在申请内存后,无法释放已申请的内存空 ...
- 牛客网Java刷题知识点之内存溢出和内存泄漏的概念、区别、内存泄露产生原因、内存溢出产生原因、内存泄露解决方案、内存溢出解决方案
不多说,直接上干货! 福利 => 每天都推送 欢迎大家,关注微信扫码并加入我的4个微信公众号: 大数据躺过的坑 Java从入门到架构师 人工智能躺过的坑 ...
- Java 内存泄露的理解与解决过程
本文详细地介绍了Java内存管理的原理,以及内存泄露产生的原因,同时提供了一些列解决Java内存泄露的方案,希望对各位Java开发者有所帮助. Java内存管理机制 在C++ 语言中,如果需要动态分配 ...
- JAVA 内存泄露的理解
1 什么是内存泄露? 内存泄露是指没用的对象持续占有内存空间,造成内存空间浪费.所以说JAVA是有内存泄露的. 2 内存泄露的原因是什么? 较长生命周期对象持有短生命周期对象的引用,导致短生命周期对象 ...
- [译]Java内存泄露介绍
(本文章翻译自the-introduction-of-memory-leak-what-why-and-how) Java最大的优势之一就是它的内存管理机制.你可以简单创建对象然后垃圾回收器会负责分配 ...
- java内存泄露问题
内存泄露是指一个不再被程序使用的对象或变量还在内存中占用存储空间. 在Java语言中,判断一个内存空间是否符合垃圾回收的标准有两个: ①给对象赋予了空值null,以后再没有使用过: ②给对象赋予了新值 ...
- java内存泄露的理解与解决(转)
Java内存管理机制 在C++语言中,如果需要动态分配一块内存,程序员需要负责这块内存的整个生命周期.从申请分配.到使用.再到最后的释放.这样的过程非常灵活,但是却十分繁琐,程序员很容易由于疏忽而忘记 ...
随机推荐
- android 模拟器
参考:http://www.syscs.com/node/504 --skin WVGA800 - -no-boot-anim -wipe-: the dpi for the device you a ...
- 年底奉献-QT编写视频监管平台(开源)
忙忙碌碌又是一年,算算自己毕业四年半,一直在现在这家公司做研发外加总经理助理,研发起初用的VB.NET,而后全面转为C#,最后又全面转为QT,都是由于项目需要,算下来自己搞QT编程也已经四年了,201 ...
- 打开jnlp Faild to validate certificate, the application will not be executed.
今天连jenkins, 本来好好的,只是我在一台机器上一直不断的启动不同的jnlp,绑定不同命名的slave, 然后突然就报错了, 如下截图所示:
- git merge之squash
看CM源码时,发现历史记录里有很多squash,于是google了解了一下. Git相对于CVS和SVN的一大好处就是merge非常方便,只要指出branch的名字就好了,如: 1 2 3 4 5 $ ...
- Fast 迅捷网络 无线路由器FW323的功能设置
一.问题的提出 1.有一个无线路由器,型号:Fast 迅捷网络 无线路由器FW323 2.有三个网络层级,第一级,用一个路由器A负责对接互联网,内网IP段为192.168.1.*,网关设置192.16 ...
- iOS开发中一些常见的并行处理(转)
本文主要探讨一些常用多任务的最佳实践.包括Core Data的多线程访问,UI的并行绘制,异步网络请求以及一些在运行态内存吃紧的情况下处理大文件的方案等. 其实编写异步处理的程序有很多坑!所以,本文 ...
- Android中查找一个Layout中指定的子控件
我们通常希望查找一个页面中指定类型的控件,单个控件知道id很容易找到,但是如果是多个呢?或者说是在程序中自定义的控件,且不知道id怎么办呢?如想找到页面中的Spinner,可用以下方法 /** * 从 ...
- [OpenCV] Image Processing - Image Elementary Knowledge
"没有坚实的理论基础,实践只会浅尝于表面." 这是两本打基础的书,没系统学过的话,怎么好意思说自己会CV. 该领域,兴军亮 这个名字屡次出现,看来是计算机视觉领域国内的年轻才俊,向 ...
- 【转载】Linux之gdb
转载自:http://blog.chinaunix.net/uid-22312037-id-3812061.html 一.常规调试 gdb是Linux下常用的程序调试工具,当然前提是用 ...
- Python单元测试框架之pytest -- 断言
对于测试来讲,不管是功能测试,自动化测试,还是单元测试.一般都会预设一个正确的预期结果,而在测试执行的过程中会得到一个实际的结果.测试的成功与否就是拿实际的结果与预期的结果进行比较.这个比的过程实际就 ...