对于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. arm 交叉编译时 gcc 的 Options

    https://sourceware.org/binutils/docs/as/ARM-Options.html https://gcc.gnu.org/onlinedocs/gcc-4.5.3/gc ...

  2. XXX 用户 is not in the sudoers file. This incident will be reported 的问题解决方案

    说的是,这种问题,是出现在ubuntu系统里. root@SparkSingleNode:/usr/local/jdk# pwd /usr/local/jdk root@SparkSingleNode ...

  3. CentOS的Redis内存分配策略配置

    安装了一主两从节点,启动之后发现有一个警告: 大概是说overcommit_memory设置成了0,在低内存环境下后台保存可能会失败,设置成1重启可解决. 然后,不太懂这个配置的含义,google一把 ...

  4. 问题-Delphi编译到最后Linking时总是出现与ntdll.dll有关的错误还有Fatal Error Out of memory错误

    1.跳出错误法  ===================================================在主界面的implementation  {$R *.dfm} 下放入以下代码: ...

  5. hdu4433 locker

    暴力dp.. dp[i][j][k] 表示 前i位完全匹配 j 表示i+1位 k表示i+2位 枚举j k #include<iostream> #include<cstdio> ...

  6. [四]JFreeChart实践三之饼图

    饼图pie 原理总结 1.准备好要显示的数据放入dataset 2.调用ChartFactory将dataset作为参数传递进去,生成chart 3.掉Servlet工具类将chart作为参数传入生成 ...

  7. IOS 获取屏幕尺寸

    CGRect frame = [[UIScreen mainScreen] bounds];    NSLog(@"frame :%@",frame); 这样输入是null NSL ...

  8. 【DB】HBase的基本概念

    一 Hbase是个啥东东?  在说Hase是个啥家伙之前,首先我们来看看两个概念.面向行存储和面向列存储.面向行存储.我相信大伙儿应该都清楚,我们熟悉的RDBMS就是此种类型的.面向行存储的数据库主要 ...

  9. android91 代码注册广播接收者

    Activity: package com.itheima.register; import android.os.Bundle; import android.app.Activity; impor ...

  10. redis-BOOK

    https://www.gitbook.com/book/gnuhpc/redis-all-about/details