java内存回收机制

不论哪种语言的内存分配方式,都需要返回所分配内存的真实地址,也就是返回一个指针到内存块的首地址。java中对象是采用new或者反射的方法创 建的,这些对象的创建都是在堆中分配,所有对象的回收都是由java虚拟机通过垃圾回收机制完成的。GC为了能够正确释放对象,会监控每个对象的运行状 况,对他们的申请、引用、被引用、赋值等状况进行监控,java会使用有向图的方法进行管理内存,实时监控是否可以到达,如果不可达,则将其回收,这样也 可以消除应用循环的问题。在java语言中,判断一个内存空间是否符合垃圾收集标准有两个:一个给对象赋予了空值null,以下再没有调用过。另一个是给 对象赋予了新值,这样重新分配了空间。

java内存泄露和内存溢出

java内存泄露就是没有及时清理内存垃圾,导致系统无法再提供给你内存资源(内存资源耗尽);而java内存溢出就是你要求分配的内存超出了系统所能给你的,系统不能满足需求,于是产生溢出。

java内存泄露和内存溢出的区别

内存溢出就是你要求分配的内存超出了系统能给你的,系统不能满足需求, 于是产生溢出。

java内存泄露就是没有及时清理内存垃圾,导致系统无法再给你提供内存资源。

1、java内存泄露其实就是程序的逻辑问题,造成申请的内存无法释放,这样的话无论多少内存,早晚会被占用光。最简单的例子就是死循环。由于程序判断错误经常出现此类问题。

2、java内存泄露是指在堆上分配的内存没有被释放,从而失去对其控制。这样会造成程序能使用的内存越来越少,导致系统运行速度减慢,严重情况会使程序当掉。

3、内存溢出是比如你申请了一个Integer,但是你存了一个long类型才能存下的数,那么就会造成内存溢出。

区别:内存溢出是提供的内存不够;内存泄露是无法提供内存资源。

java内存泄露的几个原因

1、静态集合类象Hash、Vector等的使用最容易引起内存泄露,这些静态变量的声明周期和应用程序一致,所有的对象Object也不能被释放,因为他们也将被Vector等应用着。

2、内部类和外部类的使用容易引起内存泄露的问题。内部类的引用时比较容易遗忘的一种,而且一旦没有释放就可能导致一系列的后继类对象没有释放。此 外程序员还要小心外部模块的不经意的引用。例如程序员A负责A模块,调用了B模块的一个方法如:public void registerMsg(Object b);这种调用就要非常小心,传入了一个对象,很可能模块B就保持了对该对象的引用,这时候就需要注意模块B是否提供相应的操作去除引用。

3、监听器的使用,java往往会用到监听器,在释放对象的时候没有响应删除监听器的时候也可能导致内存泄露。

4、大量临时变量的使用,没有及时将对象设置为null也可能会导致内存的泄露。

5、数据库的连接没有关闭的情况,包括连接池方法链接数据库,如果没有关闭ResultSet等也可能会出现内存泄露的问题。数据库连接,网络连接 和io连接,除非其显式调用了其close()方法将其连接关闭,否则是不会自动被GC回收的。对于ResultSet和Statement对象可以不进 行显示回收,但Connection一定要现实回收,因为Connection在任何时候都无法自动回收,而Connection一旦回 收,ResultSet和Statement对象就会被设置为null,但是如果没有连接池,情况就不一样了,除了要显示地关闭连接,还必须显示关闭 ResultSet Statement对象(关闭其中一个,另一个也会关闭),否则就会造成大量Statement对象无法释放,从而引起内存泄露。这种情况下一般都会在 try里面去连接,在finally里面释放连接。

java 内存机制简介的更多相关文章

  1. java基础知识(四)java内存机制

    Java内存管理:深入Java内存区域 上面的文章对于java的内存管理机制讲的非常细致,在这里我们只是为了便于后面内容的理解,对java内存机制做一个简单的梳理. 程序计数器:当前线程所执行的字节码 ...

  2. java内存机制 垃圾回收

    gc机制一 1.JVM的gc概述 gc即垃圾收集机制是指jvm用于释放那些不再使用的对象所占用的内存.java语言并不要求jvm有gc,也没有规定gc如何工作.不过常用的jvm都有gc,而且大多数gc ...

  3. java 内存机制

    1.Java的内存机制 Java 把内存划分成两种:一种是栈内存,另一种是堆内存.在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配,当在一段代码块定义一个变量时,Java 就在 ...

  4. java内存机制和GC垃圾回收机制

    Java 内存区域和GC机制 转载来源于:https://www.cnblogs.com/zhguang/p/3257367.html 感谢 目录 Java垃圾回收概况 Java内存区域 Java对象 ...

  5. Java内存机制,内存地址

    问题一:String str1 = "abc"; String str2 = "abc"; System.out.println(str1==str2); // ...

  6. java内存区域简介

    运行时数据区域 1.程序计数器:是一块较小的内存空间,可以看做当前线程所执行的字节码的行号指示器.字节码解释器工作时就是通过改变计数器的值来选取下一条需要执行的字节码指令,分支.循环.跳转.异常处理. ...

  7. Java SPI机制简介

    SPI 简介 SPI 全称为 (Service Provider Interface) ,是JDK内置的一种服务提供发现机制. 目前有不少框架用它来做服务的扩展发现, 简单来说,它就是一种动态替换发现 ...

  8. Java 内存机制、内存泄露

    http://wenku.baidu.com/view/61f31da6284ac850ad02423e.html 自己注:hashset和hashmap不同 JDK1.6 API 中 HashSet ...

  9. JAVA内存机制

    Java程序运行时,数据会分区存放,JavaStack(Java栈). heap(堆).method(方法区). 一.JVM内存模型 1.Java栈Java栈的区域很小,只有1M,特点是存取速度很快, ...

随机推荐

  1. 介绍Android HAL的一篇好文章

    从Linux driver到HAL再到JNI再到Java都讲了一个遍,算是对HAL有一个基本的了解了,其中hw_module_t的设计非常巧妙,每个module都会有自己的特定函数,而HAL是不知道的 ...

  2. python核心编程学习记录之文件和输入输出

  3. LeetCode----326. Power of Three(Java)

    package isPowerOfThree326; /* Given an integer, write a function to determine if it is a power of th ...

  4. ReactJs入门教程

    现在最热门的前端框架有AngularJS.React.Bootstrap等.自从接触了ReactJS,ReactJs的虚拟DOM(Virtual DOM)和组件化的开发深深的吸引了我,下面来跟我一起领 ...

  5. a标签样式

    .a{            cursor:pointer;            color: blue;            text-decoration:none;        }

  6. JAVA基础知识之JDBC——RowSet

    RowSet概念 在C#中,提供了一个DataSet,可以把数据库的数据放在内存中进行离线操作(读写),操作完成之后再同步到数据库中去,Java中则提供了类似的功能RowSet. RowSet接口继承 ...

  7. noi 9271 奶牛散步

    题目链接:http://noi.openjudge.cn/ch0206/9271/ 同noi 踩方格,但是题目有问题,%12345,我也是看了discuss才知道的. #include <bit ...

  8. [问题2014S06] 解答

    [问题2014S06]  解答  (本解答由巴闻嘉同学给出) 设特征多项式 \[f(x)=\det(xI_V-\varphi)=x^n+a_{n-1}x^{n-1}+\cdots+a_1x+a_0,\ ...

  9. excel如何用公式判断单元格的值是否为数字、英文、中文,以及相应的计数

    一.excel如何用公式判断单元格的值是否为数字.英文.中文. A列为数据列,B列为判断列=LOOKUP(CODE(ASC(A1)),{48,65,123;"数字","英 ...

  10. mongodb中的副本集搭建实践

    准备运行1个主节点,2个从节点,从节点中其中是一个是仲裁节点(Arb). --oplogSize --oplogSize --oplogSize 其中application是副本集的名称,节点必须相同 ...