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++语言中,如果需要动态分配一块内存,程序员需要负责这块内存的整个生命周期.从申请分配.到使用.再到最后的释放.这样的过程非常灵活,但是却十分繁琐,程序员很容易由于疏忽而忘记 ...
随机推荐
- preg_match_all正则表达式的基本使用
了解正则表达式之前,须要掌握一些常用的正则表达式的基础知识,这些如果能记得最好记得,记不住须要用的时候能查到就行,就多个特殊字符,所以说正则表达式玩的就是特殊,具体大家可以查看更加细致的说明. pre ...
- 为什么这样写js:(function ($) { })(jQuery);
很多时候,会这样写js,比如公司的项目里面的js页面都这样,所以我就想搞清楚意思: <script language="javascript" type="text ...
- php 类文件加载 Autoloader
做习惯了编译语言,转到php 使用 php的面向对象开发时候遇见一个挺别扭的问题.在Php中引入对象 后 在调用过程中还需要将对象所在的php文件 require 到当前php文件 目前代码结构 in ...
- Go加密解密之RSA[转]
安全总是很重要的,各个语言对于通用的加密算法都会有实现.前段时间,用Go实现了RSA和DES的加密解密,在这分享一下.(对于RSA和DES加密算法本身,请查阅相关资料) 在PHP中,很多功能经常是一个 ...
- 互联网金融必须知道:O2O、P2P、MRD、BRD、LBS、PV、UV、KPI、MRD、VP、UED....
进入互联网的朋友们和身为互联网业内人士,你们知道有多少专业术吗?有时候专业术语也是一种逼格.商业需求文档,市场需求文档,产品需求文档,功能详细说明文档,华丽丽的各种文档你知道吗?用户体验,用户界面,用 ...
- ruby -- 进阶学习(十二)fragment cache
基于rails4.0环境 Rails 页面缓存的方法很多,最近弱弱地尝试了fragment cache,用法还算简单~@_@|| 首先,查看config/environment/production. ...
- HMM 自学教程(五)前向算法
本系列文章摘自 52nlp(我爱自然语言处理: http://www.52nlp.cn/),原文链接在 HMM 学习最佳范例,这是针对 国外网站上一个 HMM 教程 的翻译,作者功底很深,翻译得很精彩 ...
- 免费下载:用于原型设计的 iOS 7 线框图
André Revin 使用 Illustrator 创建 iOS7 iPhone 5 的样机原型.这是一个像素完美的线框样机,可以帮助超级轻松的打造你的原型.你可以免费下载源文件,并在工作中使用. ...
- Nightwatch.js – 轻松实现浏览器的自动测试
Nightwatch.js 是一个易于使用的,基于 Node.js 平台的浏览器自动化测试解决方案.它使用强大的 Selenium WebDriver API 来在 DOM 元素上执行命令和断言. 语 ...
- 经典设计:30个另类的 404 not found 页面设计
404页面是每个网站必不可少的一部分.我们在网络上能看到很多创意的404错误页面.在这篇文章中,我挑选了30个充满灵感和启发性的404页面设计的例子.Web 设计师们花精力设计一个另类的自定义的404 ...