Java内存泄露

1. Java内存泄漏与C++的区别

在Java 中,内存泄漏就是存在一些被分配的对象,这些对象有下面两个特点,首先,这些对象是可达的,即在有向图中,存在通路可以与其相连;其次,这些对象是无用的,即程序以后不会再使用这些对象。如果对象满足这两个条件,这些对象就可以判定为Java 中的内存泄漏,这些对象不会被GC 所回收,然而它却占用内存。在C++中,内存泄漏的范围更大一些。有些对象被分配了内存空间,然后却不可达,由于C++中没有GC,这些内存将永远收不回来。在Java 中,这些不可达的对象都由GC 负责回收,因此程序员不需要考虑这部分的内存泄漏。

2. 内存泄露示例

Vector v = new Vector(10);
for (int i = 1; i < 100; i++) {
    Object o = new Object();
    v.add(o);
    o = null;
}

Vector中引用的对象存在引用未被释放,出现内存泄漏。

3. 内存泄漏原因

3.1 静态集合类如HashMap,Vector。

3.2 监听器,例如addXXXListener()释放的时候需要删除监听器

3.3 物理连接,如数据库连接,网络连接,不使用的时候需要close。如果使用连接池,显式关闭连接外还需要显式关闭ResultSet Statement对象。

附:subString的内存泄漏

List<String> handler = new ArrayList<String>();
for (int i = 0; i < 1000; i++) {
    String str = new String(new char[10000000]);
    handler.add(str.substring(1, 5));
}

分析subString源码:

String(int offset, int count, char value[]) {
    this.value = value;
    this.offset = offset;
    this.count = count;
}

实际上为了加快运行的效率,牺牲了内存空间。导致subString得到的对象占用空间并未减少。因此需要调用其拷贝构造方法,修改为

handler.add(new String(str.substring(1, 5)));

分析该构造方法的代码,如果String的大小比其中包含的char数组大小要小,那么就做一次部分拷贝。否则与subString方法类似。

时间: 2024-10-02 02:53:08

Java内存泄露的相关文章

android开发中的java内存泄露分析

做了较长时间的android开发了,发现其实android应用开发入门容易,但是进阶或者成为高级工程师,需要具备的基础能力还是非常高的:性能优化.内存泄露.apk瘦身.热修复等等,这些都非常的考验一个人的能力.android成长之路还很长,自己会持续的走下去.本文主要介绍android内存泄露方面的知识.其实要真的理解内存泄露,需要对JVM.java语言有一定的了解,在这个基础上就比较容易理解本文了. 一.内存泄露概念 在java中,如果一个对象没有可用价值了,但又被其他引用所指向,那么这个对象

Java内存泄露问题分析

很多人在谈论内存泄露问题,当然对于c/c++来说,这个应该是老掉牙的问题,但是很多Java人员也越来越多得讨论这个问题,我这里写个小结,希望对大家有一定的参考价值. 内存泄漏的慨念 1.c/c++是程序员自己管理内存,Java内存是由GC自动回收的. 我虽然不是很熟悉C++,不过这个应该没有犯常识性错误吧. 2.什么是内存泄露? 内存泄露是指系统中存在无法回收的内存,有时候会造成内存不足或系统崩溃. 在C/C++中分配了内存不释放的情况就是内存泄露. 3.Java存在内存泄露 我们必须先承认这个

使用OptimizeIT进行Java内存泄露的检测

java程序也会引起内存泄露已经是公开的秘密了,工作中需要对该问题引起充分的重视. 市场上能够进行java内存检测的工具也有不少,我在工作中使用JBuilder自带的Optimize工具,现就最近一次使用Optimize的工程及经验进行以下梳理. 前一段时间根据需要,对工作中维护的某个模块进行了java内存泄露的测试,结果发现了很严重的问题:该模块一共有6大基本功能,每个功能每操作一次,大约要新消耗9-10k的内存空间,生成110个左右的新对象.作为商用软件产品是绝不允许这样的问题的出现的. O

java内存泄露的理解与解决

java内存管理机制 在c++ 语言中,如果需要动态分配一块内存,程序员需 要负责这块内存的整个生命周期.从申请分配.到使用.再到最后的释放.这样的过程非常灵活,但是却十分繁琐,程序员很容易由于疏忽而忘记释放内存,从而导 致内存的泄露. java 语言对内存管理做了自己的优化,这就是垃圾回收机制. java 的几乎所有内存对象都是在堆内存上分配(基本数据类型除外),然后由 gc ( garbage collection)负责自动回收不再使用的内存. 上面是java 内存管理机制的基本情况.但是如

如何排查Java内存泄露(内附各种排查工具介绍)

今天刚刚才加一个故障review会议, 故障非常典型, google下也可以找到相似案例介绍. 在排查问题的过程中,使用了大量的工具, 发现有问题的地方还不只一个,总结一下. (本篇文章不会重点描述案例本身,重点会介绍个人对java内存泄露问题的排查思路和各种工具的使用). java内存泄露典型特征 现象一: 堆/Perm 区不断增长, 没有下降趋势(回收速度赶不上增长速度), 最后不断触发FullGC, 甚至crash(如下**两张图是同一个应用的GC和Perm数据, GC触发原因确认是Per

Android 和 Java 内存泄露检测工具——LeakCanary

LeakCanary Android 和 Java 内存泄露检测. "A small leak will sink a great ship." - Benjamin Franklin 千里之堤, 毁于蚁穴. -- <韩非子·喻老> demo 一个非常简单的 LeakCanary demo: https://github.com/liaohuqiu/leakcanary-demo 开始使用 在 build.gradle 中加入引用,不同的编译使用不同的引用: depende

关于java内存泄露求大神帮忙分析

问题描述 关于java内存泄露求大神帮忙分析 用MAT进行分析但是有点看不懂求大神帮忙分析一下 解决方案 Java内存泄露和分析Java内存泄露分析Java内存泄露问题分析 解决方案二: Details 看看 解决方案三: 你看看你有没有写入到内存里很大的文件 解决方案四: 这是今天重新定位问题的明细图片 解决方案五: 这是相关数据的图片

java内存泄露是错误还是异常

问题描述 今天去掏宝面试,被问到"java的内存泄露是错误还是异常?"我答:是错误我不知道答得对不对?请大家说说!! 解决方案 解决方案二:个人愚见:如果内存泄露的消息被java反馈回来,并有警示消息那么应该是异常,应该说所谓"异常"就是被程序捕获的错误,超出程序预期的目的或者计划.如果内存泄露后,未能捕获进而引发了灾难性的后果,例如主程序崩溃或者蓝屏死机,那么就是应该是错误.能否捕获并处理是区分是否是错误或者异常的关键,这个题目感觉出的很模糊,java的内存泄露到

详细介绍Java内存泄露原因_java

一.Java内存回收机制 不论哪种语言的内存分配方式,都需要返回所分配内存的真实地址,也就是返回一个指针到内存块的首地址.Java中对象是采用new或者反射的方法创建的,这些对象的创建都是在堆(Heap)中分配的,所有对象的回收都是由Java虚拟机通过垃圾回收机制完成的.GC为了能够正确释放对象,会监控每个对象的运行状况,对他们的申请.引用.被引用.赋值等状况进行监控,Java会使用有向图的方法进行管理内存,实时监控对象是否可以达到,如果不可到达,则就将其回收,这样也可以消除引用循环的问题.在J

【hibernate框架】性能优化之session.clear()的运用和Java内存泄露问题

注意session.clear()的运用,尤其在不断分页循环的时候.a)在一个大集合中进行遍历,遍历msg,取出其中的含有敏感字样的对象. hibernate里面有一个缓存,是session级的缓存.一张表里面存了上百万的商品信息,我们要取出这些内容并且进行分页,点击下一页查看商品信息,现在假设在同一个session里面执行这个操作,这时候就会有问题.session先取50条进来,然后再开一个session,上一个session就会被清除,被清的过程是由java虚拟机的垃圾清除器来完成,什么时候