内存泄漏与内存溢出

内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;

内存泄露 memory leak,是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。

## memory leak会最终会导致out of memory!


内存泄漏

长生命周期的对象引用短声明周期的对象,导致短生命周期的对象在生命周期已结束后还无法回收对象内存 ,造成内存泄漏

场景

  • 1、静态集合引用对象
public class dome1 {
    static Set<Object> s = new HashSet(10);
    public static void main(String[] args) {

        for (int i = 0; i < 100; i++) {
            Object o = new Object();
            s.add(o);
            //对象赋值位空值,理应被垃圾回收器回收,但是被集合引用,
            // 但是GC-Roots 到对象之间存在引用链(可到达),
            //所以不会被回收内存
            o = null;
        }
        s.forEach(System.out::println);
    }
}
  • 2、集合里面的对象属性被修改,在调用remove()方法时不起作用,造成对象删除不掉,造成内存泄漏
HashSet<Person> set = new HashSet<>();
Person tom = new Person(1L, "Tom", 12);
System.out.println(tom.hashCode());//2613467
set.add(tom);
tom.setAge(13);//修改对象的属性后对象的hashCode发生变化
System.out.println(tom.hashCode());//2613468
System.out.println(set.remove(tom));//false  remove不成功,造成内存泄漏
set.forEach(System.out::println);
System.out.println(set.add(tom));// true  添加成功,判断是否相等时验证hashCode
set.forEach(System.out::println);
  • 3、监听器未删除
  • 4、各种连接为关闭

数据库链接、网络链接、IO链接必须显式的调用close关闭链接,否则不会被GC回收

  • 5、内部类和外部模块的引用
  • 6、单例模式引用其他对象

    单例模式为静态资源,整个JVM生命周期都有效,如果单例对象持有对外部对象的引用,那么这个外部对象不会被GC回收,导致内存泄漏

if (true){
    Person tom = new Person(1L, "Tom", 12);
    singleton.getInstance().setPerson(tom);
}
System.out.println(singleton.getInstance().getPerson());

对象tom已经结束生命周期,但是被单例对象引用,不会被GC回收

二、内存溢出

在Java堆中不断的创建对象造成

大量的内存泄漏

原文地址:https://www.cnblogs.com/mingyi123/p/9383924.html

时间: 2024-10-06 23:57:20

内存泄漏与内存溢出的相关文章

Android 系统开发_内存泄漏篇 -- &quot;内存泄漏&quot;的前世今生

基础了解 什么是内存泄漏? 内存泄漏是当有程序不再使用到的内存时,释放内存失败而产生了无用的内存消耗.内存泄漏并不是指物理上的内存消失,这里的内存泄漏是指由程序分配的内存,由于程序逻辑错误而导致程序失去了对该内存的控制,使得内存浪费. Java 内存分配策略 Java 程序运行时的内存分配策略有三种,分别是?静态分配?.?栈式分配?和?堆式分配?,对应的三种存储策略使用的内存空间主要分别是?静态存储区(也称方法区)?.?栈区?和?堆区?. -?静态存储区(方法区):主要存放?静态数据?.?全局

(转)从内存管 理、内存泄漏、内存回收探讨C++内存管理

http://www.cr173.com/html/18898_all.html 内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了更好的性能,更大的自由,C++菜鸟的收获则是一遍一遍的检查代码和对 C++的痛恨,但内存管理在C++中无处不在,内存泄漏几乎在每个C++程序中都会发生,因此要想成为C++高手,内存管理一关是必须要过的,除非放弃 C++,转到Java或者.NET,他们的内存管理基本是自动的,当然你也放弃了自由和对内存的支配权,还放弃了C++超绝的性能

如何使用 Chrome 和 DevTools 查找影响页面性能的内存问题,包括内存泄漏、内存膨胀和频繁的垃圾回收

了解如何使用 Chrome 和 DevTools 查找影响页面性能的内存问题,包括内存泄漏.内存膨胀和频繁的垃圾回收. TL;DR 使用 Chrome 的任务管理器了解您的页面当前正在使用的内存量. 使用 Timeline 记录可视化一段时间内的内存使用. 使用堆快照确定已分离的 DOM 树(内存泄漏的常见原因). 使用分配时间线记录了解新内存在 JS 堆中的分配时间. 概览 在 RAIL 性能模型的精髓中,您的性能工作的焦点应是用户. 内存问题至关重要,因为这些问题经常会被用户察觉. 用户可通

内存泄漏,内存溢出

内存溢出(out of memory):指程序申请内存时,没有足够的空间供其使用: 内存泄漏(memory leak):指程序申请了一块内存,但是这块内存不能被释放. 内存泄漏最终会导致内存溢出. 内存泄漏,简单来说就new之后没有delete,然后就丢失了对象的指针,没法释放了.在C++中这可能会造成很严重的后果:Java有垃圾回收机制,会把没有被引用的内存回收,但是垃圾回收器各个JVM的实现并不同,效率也无法保证,因此还是要保持良好的编程习惯,及时释放内存.

内存泄漏和内存溢出的区别

内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory:比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢出. 内存泄露 memory leak,是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光. memory leak会最终会导致out of memory! 内存溢出就是你要求分配的内存超出了系统能给你的,系统不能满足需求,于是产

内存泄漏和内存溢出的优化

内存泄漏: 对象在内存heap堆中中分配的空间, 当不再使用或没有引用指向的情况下, 仍不能被GC正常回收的情况. 多数出现在不合理的编码情况下, 比如在Activity中注册了一个广播接收器, 但是在页面关闭的时候进行unRegister, 就会出现内存溢出的现象. 通常情况下, 大量的内存泄漏会造成OOM. OOM: 即OutOfMemoery, 顾名思义就是指内存溢出了. 内存溢出是指APP向系统申请超过最大阀值的内存请求, 系统不会再分配多余的空间, 就会造成OOM error. 在我们

内存泄漏和内存溢出

内存泄漏(Memory leak),也称内存渗漏,是指应用程序在利用完内存后,没有对内存进行释放,导致当前内存的浪费(丢失):一次的内存泄漏,可能不严重,但是如果出现内存泄漏的堆积,则会引发内存溢出,致使系统中的应用程序不能正常运行. 内存溢出(Out of memory),是指应用程序在申请内存后,系统提供的内存不能满足被申请的空间,称为内存溢出.举个例子,一个篮子只能装10个苹果,但在装1个苹果的时候,苹果就会从篮子里掉下来,苹果掉地上了,就不能吃了,就是这个道理. 内存泄漏的堆积会引发内存

内存泄漏、内存溢出和解决方案

执行过程中的内存空间未释放时应用程序后,动态内存泄漏不再使用,因此,很可能导致应用程序的内存无线增长.泄露包含未对系统的资源的及时释放,比方句柄等. 内存溢出即用户在对其数据缓冲区操作时.超过了其缓冲区的边界:尤其是对缓冲区写操作时,缓冲区的溢出非常可能导致程序的异常. 一.内存泄露 "知己知彼.方能百战不殆",假设我们可以比較清楚的了解在编程的时候哪些情况easy导致内存泄露.通过避免这些糟糕的情况,从提高代码的质量本身出发,来抵御潜在导致内存泄露的发生. 1.1先来看看内存泄露可能

java 关于内存泄漏和内存溢出

内存溢出和内存泄漏的区别 1. 内存溢出:out of memory ,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory:比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢出. 例如: 1.内存中加载的数据量过于庞大,如一次从数据库取出过多数据: 2.集合类中有对对象的引用,使用完后未清空,使得JVM不能回收: 3.代码中存在死循环或循环产生过多重复的对象实体: 4.使用的第三方软件中的BUG: 5.启动参数内存值设定的过小 2. 内存泄漏