很多人在谈论内存泄露问题,当然对于c/c++来说,这个应该是老掉牙的问题,但是很多Java人员也越来越多得讨论这个问题,我这里写个小结,希望对大家有一定的参考价值。

内存泄漏的慨念

1。c/c++是程序员自己治理内存,Java内存是由GC自动回收的。

我虽然不是很熟悉C++,不过这个应该没有犯常识性错误吧。

2。什么是内存泄露?

内存泄露是指系统中存在无法回收的内存,有时候会造成内存不足或系统崩溃。

在C/C++中分配了内存不释放的情况就是内存泄露。

3。Java存在内存泄露

我们必须先承认这个,才可以接着讨论。

虽然Java存在内存泄露,但是基本上不用很关心它,非凡是那些对代码本身就不讲究的就更不要去关心这个了。

Java中的内存泄露当然是指:存在无用但是垃圾回收器无法回收的对象。而且即使有内存泄露问题存在,也不一定会表现出来。

4。Java中参数都是传值的。

对于基本类型,大家基本上没有异议,但是对于引用类型我们也不能有异议。

Java是如何管理内存

为了判断Java中是否有内存泄露,我们首先必须了解Java是如何管理内存的。Java的内存管理就是对象的分配和释放问题。在Java中,程序员需要通过关键字new为每个对象申请内存空间 (基本类型除外),所有的对象都在堆 (Heap)中分配空间。

另外,对象的释放是由GC决定和执行的。在Java中,内存的分配是由程序完成的,而内存的释放是有GC完成的,这种收支两条线的方法确实简化了程序员的工作。但同时,它也加重了JVM的工作。这也是Java程序运行速度较慢的原因之一。因为,GC为了能够正确释放对象,GC必须监控每一个对象的运行状态,包括对象的申请、引用、被引用、赋值等,GC都需要进行监控。

监视对象状态是为了更加准确地、及时地释放对象,而释放对象的根本原则就是该对象不再被引用。

为了更好理解GC的工作原理,我们可以将对象考虑为有向图的顶点,将引用关系考虑为图的有向边,有向边从引用者指向被引对象。另外,每个线程对象可以作为一个图的起始顶点,例如大多程序从main进程开始执行,那么该图就是以main进程顶点开始的一棵根树。

在这个有向图中,根顶点可达的对象都是有效对象,GC将不回收这些对象。如果某个对象 (连通子图)与这个根顶点不可达(注意,该图为有向图),那么我们认为这个(这些)对象不再被引用,可以被GC回收。

以下,我们举一个例子说明如何用有向图表示内存管理。

对于程序的每一个时刻,我们都有一个有向图表示JVM的内存分配情况。以下右图,就是左边程序运行到第6行的示意图。

Java使用有向图的方式进行内存管理,可以消除引用循环的问题,例如有三个对象,相互引用,只要它们和根进程不可达的,那么GC也是可以回收它们的。

这种方式的优点是管理内存的精度很高,但是效率较低。另外一种常用的内存管理技术是使用计数器,例如COM模型采用计数器方式管理构件,它与有向图相比,精度行低(很难处理循环引用的问题),但执行效率很高。

Java内存泄露情况

JVM回收算法是很复杂的,我也不知道他们怎么实现的,但是我只知道他们要实现的就是:对于没有被引用的对象是可以回收的。

所以你要造成内存泄露就要做到:

持有对无用对象的引用!

不要以为这个很轻易做到,既然无用,你怎么还会持有它的引用? 既然你还持有它,它怎么会是无用的呢?

我实在想不到比那个堆栈更经典的例子了,以致于我还要引用别人的例子,下面的例子不是我想到的,是书上看到的,当然假如没有在书上看到,可能过一段时间我自己也想的到,可是那时我说是我自己想到的也没有人相信的。

public class Stack {

private Object[] elements=new Object[10];

private int size = 0;

public void push(Object e){

ensureCapacity();

elements[size++] = e;

}。

全部

java内存泄露有什么后果,Java内存泄露问题是什么?相关推荐

  1. 服务器主板芯片和内存条兼容性,选购内存最大的坑:莫过于内存与主板的兼容性问题...

    很多用户购买内存,往往会把主要的关注度,集中在内存容量.频率.时序.价格,甚至灯效.外观等方面,却很少有人会留意到[内存的兼容性].但是我想说,选购内存最大的坑,莫过于内存与主板的兼容性问题. ▲内存 ...

  2. Java技术专题之JVM你的内存泄露了吗?

    一.从一个例子开始 关于JVM的内存泄露,让我们从下面一个例子开始吧,大家来判断一下如果按照下面这种分配方式,会不会出现内存泄露呢? 1 import java.util.List; 2 import ...

  3. java中为什么还要防止内存泄露_JAVA防止内存的泄漏什么意思,内存还能泄露?...

    展开全部 尽管java虚拟机和62616964757a686964616fe59b9ee7ad9431333166353066垃圾回收机制管理着大部分的内存事务,但是在java软件中还是可能存在内存泄 ...

  4. java方法区内存泄露_深入理解java虚拟机-第二章:java内存区域与内存泄露异常...

    2.1概述: java将内存的管理(主要是回收工作),交由jvm管理,确实很省事,但是一点jvm因内存出现问题,排查起来将会很困难,为了能够成为独当一面的大牛呢,自然要了解vm是怎么去使用内存的. 2 ...

  5. java避免内存泄露_Java防止非静态内部类内存泄漏

    内存泄漏 一个不会被使用的对象,因为另一个正在使用的对象持有该对象的引用,导致它不能正常被回收,而停留在堆内存中,从而导致内存泄漏. 最坏的情况下,由于大量的内存泄漏,最终导致jvm的内存耗尽,致使程 ...

  6. java 导致内存泄露的情况_JConsole定位内存泄漏

    在本文中,我们将看到Java中内存泄漏的示例代码.之后,我们将把Java应用程序连接到JConsole,比较有无内存泄漏时应用程序的内存使用情况.深入研究JConsole的内存监控工具可以让我们看到堆 ...

  7. 深入理解Java虚拟机(一):Java内存模型

    1.Java 虚拟机运行时数据区域 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存 ...

  8. 46栈内存溢出、内存区域(程序计数器、Java 虚拟机栈、本地方法栈、Java 堆、方法区、直接内存、内存溢出)与内存溢出(对象实例化分析)

    46.什么情况下会发生栈内存溢出 46.1.Java 内存区域与内存溢出 46.1.1.内存区域 46.1.1.1.程序计数器 46.1.1.2.Java 虚拟机栈 46.1.1.3.本地方法栈 46 ...

  9. dump排查内存异常 java_如何排查Java应用内存泄漏问题

    什么是内存泄漏 内存泄漏是指java应用的堆内存使用率持续升高,直至内存溢出. 内存泄漏的的原因可能有多种 分配给应用程序的内存本身过小.而应用的业务代码,确实需要生成大量的对象 代码bug,某些需要 ...

最新文章

  1. 工业环境老鼠目标检测
  2. 【转】每天一个linux命令(53):route命令
  3. OpenGL material light材质灯光的实例
  4. ramdisk根文件系统+initramfs
  5. Linux基础1之磁盘与分区
  6. 洛谷 P2286 [HNOI2004]宠物收养场
  7. 回顾 | Apache Flink Meetup ·上海站(附PPT下载链接)
  8. windows下如何用python抓取邮件内容和附件_用python下载邮件内容
  9. Linux宝库名人轶事栏目 | 云与我
  10. linux 查看指定目录的所有文件大小
  11. onselect事件在表单元素中的使用
  12. 域用户登陆显示计算机图标,PC用户或域用户登陆后任务栏无显示桌面的小图标...
  13. Failed to obtain JDBC Connection; nested exception is java.sql.SQLException: Connections could not b
  14. 在工程图中如何进行虚拟相交点标注
  15. 计算机网络什么是p2p,计算机网络-p2p(示例代码)
  16. 使用代理ccproxy设置outlook2013 收QQ邮箱(IMAP-SMTP方式)
  17. Stealing packets
  18. 午夜分享女人的绝对隐私
  19. STM32实现自定义HID复合设备
  20. AcWing 2048. 干草

热门文章

  1. 世界大学城空间代码_C++中命名空间的五大常见用法
  2. 如何处理几十万条并发数据_Swoole 如何处理高并发以及异步 I/O 的实现
  3. bp神经网络预测python代码_机器学习之多层神经网络(附Python代码和数据)
  4. 利用python安装opencv_OpenCV Python安装教程
  5. 物体运动到一个点停止_运用SolidWorks运动仿真来做的最速降线及其验证,来看看我的办法...
  6. java栈 类 堆_详细介绍Java中的堆和栈
  7. sql不替换uid的更新数据语句
  8. 大道至简,阿里巴巴敏捷教练的电子看板诞生记
  9. 关于Webview如何自动登录保存登录信息
  10. 排查访问Linux Server速度较慢的问题