对于JVM的垃圾回收机制来说,是否回收一个对象的标准在于:是否还有引用变量引用该对象,只要有引用变量引用该对象,垃圾回收机制就不会回收它。

强引用:创建一个对象,并把这个对象赋给一个引用变量。这种引用,不会被垃圾回收机制回收,及时系统资源非常紧张,即使有些Java对象以后永远都不会被用到,JVM也不会回收被强引用所引用的Java的对象。

软引用:需要通过softReference类来实现,当一个对象只具有软引用时,它有可能被垃圾回收机制回收。当系统内存空间足够时,它不会被系统回收,当系统内存空间不足时,系统将会回收它。

弱引用:与软引用相似,只不过引用对象的生存期更短。弱引用通过weakReference 类实现。对于只有弱引用的对象而言,当系统垃圾回收机制运行时,不管内存是否足够,总会回收该对象所占用的内存。

虚引用:不可单独使用。作用:主要是跟踪对象被垃圾回收的状态,程序可以通过检查与虚引用关联的引用队列中是否已经包含指定的虚引用,从而了解虚引用所引用的对象是否即将被回收。

垃圾回收的基本算法:

  1. 串行回收(serial)和并行回收(parallel):串行回收就是不管系统有多少个CPU,始终只用一个cpu来执行垃圾回收操作;并行回收就是把整个回收工作拆分成多部分,每部分有一个cpu负责,从而让多个cpu并行回收,并行回收的执行效率很高,但复杂度增加,另外也有诸如:内存碎片增加的问题。
  2. 并发执行(concurrent)和应用程序停止(stop-the-world):stop-the-world的垃圾回收方式在执行垃圾回收的同时会导致应用程序的暂停。并行执行的垃圾回收虽然不会导致应用程序的暂停,但由于并发执行垃圾回收需要解决和应用程序的执行冲突,需要更多的内存。
  3. 压缩(compacting)和不压缩(non-compacting)和复制(copying):为了减少内存碎片,支持压缩的垃圾回收期会把所有的活对象搬迁到一起,然后将之前占用的内存全部回收。不压缩式的垃圾回收器只是回收内存,这样回收回来的内存不可能是连续的,因此将会有较多的内存碎片,较之压缩式的垃圾回收,不压缩式的垃圾回收回收内存块,而分配内存时会更慢,而且无法解决内存碎片的问题。复制式的垃圾回收会将所有的可达对象复制到另一块相同的内存中,这种方式的有有点是垃圾回收过程不会产生内存碎片,但缺点是,需要复制数据和额外的内存。
注:标记清除:不压缩的回收方式

       标记压缩:压缩的回收方式

上述的复制、不压缩、压缩都是垃圾回收器回收已用的内存空间方式。

现行的回收机制是:根据对象生存时间的长短。把对内存分成3代:

  • Young(年轻带)
  • Old(老年代)
  • Permanent(永久代)

java之内存管理的更多相关文章

  1. Java的内存管理与内存泄露

    作为Internet最流行的编程语言之一,Java现正非常流行.我们的网络应用程序就主要采用Java语言开发,大体上分为客户端.服务器和数据库三个层次.在进入测试过程中,我们发现有一个程序模块系统内存 ...

  2. 让你第一次认识到Java的内存管理

    发现之前写的可读性不好,这次准备试试换风格,去掉长篇大论,觉得这个风格好的,麻烦点个赞啦 清理.JVM的妙处 大家以后都是程序员,假设你很不幸,需要自己交钱租房子. 你作为一个小穷人,租的房子到期了( ...

  3. Java虚拟机内存管理机制

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

  4. java Hotspot 内存管理白皮书(中文翻译)

    转自: http://my.oschina.net/u/568779/blog/166891 1引言 一个健壮的 Java™2平台,Standard Edition (J2SE™)拥有一个自动内存管理 ...

  5. [基础] C++与JAVA的内存管理

    在内存管理上(总之一句话——以后C++工程,一定要用智能指针!) 1.同是new一个对象,C++一定得手动delete掉,而且得时刻记住能delete的最早时间(避免使用空指针).JAVA可以存活于作 ...

  6. java HotSpot 内存管理白皮书

    原文见:http://www.open-open.com/lib/view/open1381034220705.html.查阅资料后,对原文做了补充. 文中关于JVM的介绍基于JDK1.6的Hotsp ...

  7. Java自动内存管理机制学习(一):Java内存区域与内存溢出异常

    备注:本文引用自<深入理解Java虚拟机第二版> 2.1 运行时数据区域 Java虚拟机在执行Java程序的过程中把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以及创 ...

  8. Java的内存管理机制之内存区域划分

    各位,好久不见.先做个预告,由于最近主要在做Java服务端开发,最近一段时间会更新Java服务端开发相关的一些知识,包括但不限于一些读书笔记.框架的学习笔记.和最近一段时间的思考和沉淀.先从Java虚 ...

  9. java jvm内存管理/gc策略/参数设置

    1. JVM内存管理:深入垃圾收集器与内存分配策略 http://www.iteye.com/topic/802638 Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想 ...

  10. 深入理解Java虚拟机—内存管理机制

    前面说过了类的加载机制,里面讲到了类的初始化中时用到了一部分内存管理的知识,这里让我们来看下Java虚拟机是如何管理内存的. 先让我们来看张图 有些文章中对线程隔离区还称之为线程独占区,其实是一个意思 ...

随机推荐

  1. Spark Pipe使用方法(外部程序调用方法)

    写在前面: 1.我们使用的是Hadoop2.2.0,Spark 1.0. 2.这里使用的样例是经典的求pai程序来演示这个开发过程. 3.我们暂时使用java程序来开发,按照需要后面改用scala来开 ...

  2. 用Natvis定制C++对象在Visual Studio调试时如何显示

    博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:用Natvis定制C++对象在Visual Studio调试时如何显示.

  3. bootstrap-table对前台页面表格的支持

    1.bootstrap-table是在bootstrap的基础上面做了一些封装,所以在使用bootstrap-table之前要导入的js和css有 1)基本的还是jQuery <script t ...

  4. AMQP与QPID简介

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...

  5. Unity3D问题之EnhanceScollView选择角色3D循环滚动效果实现

    需求 呈现3D效果(2D素材)选择角色效果 滚动保证层级.缩放比例.间距正常尾随 循环滚动 这个界面需求一般也会有游戏会採用(貌似有挺多) 怎样实现 实现技术关键点 (3D循环效果,依据数学函数和细致 ...

  6. 【转】C++的继承与多态:为什么需要虚函数

    转自:http://www.educity.cn/zk/gjyy/201306271108011682.htm 多态性是面向对象设计语言的基本特征.仅仅是将数据和函数捆绑在一起,进行类的封装,使用一些 ...

  7. SQL Server将一列的多行内容拼接成一行的问题讨论

    转自http://blog.csdn.net/rolamao/article/details/7745972 昨天遇到一个SQL Server的问题:需要写一个储存过程来处理几个表中的数据,最后问题出 ...

  8. Objective C 代码片段(类别)

    @interface NSString (reverse) -(NSString *) reverseString; @end @implementation NSString (reverse) - ...

  9. CentOS开发环境LAMP搭建

    CentOS开发环境搭建 -------------------------------------------------------------------------准备工作---------- ...

  10. [React Native] Up and Running

    We'll download the requirements for getting started with React Native, refactor our app to ES6, walk ...