zoukankan      html  css  js  c++  java
  • Java 中会存在内存泄漏吗,请简单描述?

    理论上 Java 因为有垃圾回收机制(GC)不会存在内存泄露问题(这也是 Java 被

    广泛使用于服务器端编程的一个重要原因);然而在实际开发中,可能会存在无

    用但可达的对象,这些对象不能被 GC 回收,因此也会导致内存泄露的发生。例如

    Hibernate 的 Session(一级缓存)中的对象属于持久态,垃圾回收器是不会回收

    这些对象的,然而这些对象中可能存在无用的垃圾对象,如果不及时关闭(close)

    或清空(flush)一级缓存就可能导致内存泄露。下面例子中的代码也会导致内存

    泄露。

    import java.util.Arrays;

    import java.util.EmptyStackException;

    public class MyStack<T> {

    private T[] elements;

    private int size = 0;

    private static final int INIT_CAPACITY = 16;

    public MyStack() {

    elements = (T[]) new Object[INIT_CAPACITY];

    }

    public void push(T elem) {

    ensureCapacity();

    elements[size++] = elem;

    }

    public T pop() {

    if(size == 0)

    throw new EmptyStackException();

    return elements[--size];

    }

    private void ensureCapacity() {

    if(elements.length == size) {

    elements = Arrays.copyOf(elements, 2 * size + 1);

    }

    }

    }

    235 页 共 485 页上面的代码实现了一个栈(先进后出(FILO))结构,乍看之下似乎没有什么明

    显的问题,它甚至可以通过你编写的各种单元测试。然而其中的 pop 方法却存在

    内存泄露的问题,当我们用 pop 方法弹出栈中的对象时,该对象不会被当作垃圾

    回收,即使使用栈的程序不再引用这些对象,因为栈内部维护着对这些对象的过

    期引用(obsolete reference)。在支持垃圾回收的语言中,内存泄露是很隐蔽的,

    这种内存泄露其实就是无意识的对象保持。如果一个对象引用被无意识的保留起

    来了,那么垃圾回收器不会处理这个对象,也不会处理该对象引用的其他对象,

    即使这样的对象只有少数几个,也可能会导致很多的对象被排除在垃圾回收之外,

    从而对性能造成重大影响,极端情况下会引发 Disk Paging(物理内存与硬盘的虚

    拟内存交换数据),甚至造成 OutOfMemoryError。

  • 相关阅读:
    PHP实现无限极分类
    html2canvas生成并下载图片
    一次线上问题引发的过程回顾和思考,以更换两台服务器结束
    Intellij IDEA启动项目报Command line is too long. Shorten command line for XXXApplication or also for
    mq 消费消息 与发送消息传参问题
    idea 创建不了 java 文件
    Java switch 中如何使用枚举?
    Collections排序
    在idea 设置 git 的用户名
    mongodb添加字段和创建自增主键
  • 原文地址:https://www.cnblogs.com/programb/p/13021324.html
Copyright © 2011-2022 走看看