Java和C++之间有一睹内存动态分配和垃圾收集技术所围成的“高墙”,墙外面的人想进去,墙里面的人想出来。-------《深入理解JVM虚拟机》

补充:在无用对象判断这两种方法中,都是靠对象的引用进行判断对象是否无用。又因为在某些情况下我们不一定需要回收对象,因此在jdk1.2后,java对引用进行了扩充,将引用分为4类“强引用”“软引用”“弱引用”“虚引用”。

补充2:对于方法区中的垃圾回收,回收效率远远低于堆,在此区域中主要回收的内容为:无用的类以及废弃的常量。废弃常量的回收与堆中非常类似,但是无用类的回收将麻烦许多。

补充3:四种引用类型:强引用,垃圾回收不回收被引用对象。软引用,内存溢出之前列入二次回收范围。弱引用,生存到下一次垃圾回收。虚引用,对象被收集时收到一个系统通知。

下面详细说说四种回收算法。

  • 标记-清除:分为两个阶段,首先是进行无用对象判断,进而标记出所有需要回收的对象,标记完成后进行统一的对象回收。此算法为回收算法最基础算法,但是其有两个缺点,效率不高和内存碎片太多。
  • 复制:将内存分为三个区域,一块大区域eden与两块小区域survivor,每次使用只使用eden和一块survivor,回收时将eden和survivor中存活的对象复制到未使用的survivor上,然后将之前使用过的区域清除。当survivor空间不够时,借用eden区域实施算法。
  • 标记整理:首先将标记对象,然后将标记的对象向内存一端移动,然后直接清理边界之外的区域。这种算法主要适用与对象存活时间长,存活率高的情况。
  • 分代收集:将内存分为老年代和新生代,针对老年代,采用标记整理算法或标记清除算法,针对新生代,采用复制算法。因为新生代中大部分对象存活时间短,存活率极低,如果使用标记整理算法效率不高,同时老年代中对象存活时间长,存活率高,使用复制算法极大影响效率。

对于垃圾回收,还有一个重要的概念 “安全点”,他用在无用对象判断前使所有线程停止,这个停止的地方就是安全点,然后进行无用对象判断这一过程。原因简单来说,你不能在内存还是动态的过程中进行判断某个对象是否无用。

如何让线程跑到安全点呢?

首先虚拟机设置一个中断标志,然后线程去主动轮询这个标志,让发现中断为真,将自己挂起。但是这里有一个漏洞,如果线程本身是挂起状态,那么这个线程如何知道现在是垃圾回收器工作中,自己不能运行呢?这里便又引入的安全区域的概念,意思是在这个区域中,gc可以安全进行。

下面将列出主要的垃圾收集器及其特点:

  • Serial(新生代)--Serial Old(老年代):单线程收集器,特点:简单高效。新生代采用“复制”,老年代采用“标记整理”。
  • ParNew(新生代):Serial的多线程版本,但在但CPU下,不一定效果比Serial好,其成为新生代收集器的选择一个很大原因是能与CMS收集器配合。新生代采用“复制”
  • Parallel Scavenge(新生代)--Parallel Old(老年代):吞吐量优先收集器。特点:可自适应调节回收时间,适合后台运算。
  • CMS(老年代):特点:并发收集,低停顿。
  • G1:最前沿收集器,按下不表。

目前虚拟机采用的收集器搭配方案:CMS-ParNew  Parallel Scavenge--Parallel Old  Serial Old-ParNew

深入java----垃圾回收的更多相关文章

  1. 【转载】Java垃圾回收机制

    原文地址:http://www.importnew.com/19085.html Java垃圾回收机制 说到垃圾回收(Garbage Collection,GC),很多人就会自然而然地把它和Java联 ...

  2. 【转】深入理解 Java 垃圾回收机制

    深入理解 Java 垃圾回收机制   一.垃圾回收机制的意义 Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再 ...

  3. 深入理解java垃圾回收机制

    深入理解java垃圾回收机制---- 一.垃圾回收机制的意义 Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再 ...

  4. Java GC系列(2):Java垃圾回收是如何工作的?

    本文由 ImportNew - 伍翀 翻译自 javapapers. 目录 垃圾回收介绍 垃圾回收是如何工作的? 垃圾回收的类别 垃圾回收监视和分析 本教程是为了理解基本的Java垃圾回收以及它是如何 ...

  5. Java GC系列(1):Java垃圾回收简介

    本文由 ImportNew - 好好先生 翻译自 javapapers. Java的内存分配与回收全部由JVM垃圾回收进程自动完成.与C语言不同,Java开发者不需要自己编写代码实现垃圾回收.这是Ja ...

  6. Java垃圾回收介绍(译)

    在Java中,对象内存空间的分配与回收是由JVM中的垃圾回收进程自动完成的.与C语言不同的是,在Java中开发者不需要专门为垃圾回收写代码.这是使Java流行的众多特征之一,也帮助了程序员写出了更好的 ...

  7. [牛感悟系列]JAVA(1)理解JAVA垃圾回收

    理解JAVA垃圾回收的好处是什么?满足求知欲是一方面,编写更好的JAVA应用是另外一方面. 如果一个人对垃圾回收过程感兴趣,那表明他在应用程序开发领域有相当程度的经验.如果一个人在思考如何选择正确的垃 ...

  8. [译]GC专家系列2:Java 垃圾回收的监控

    原文链接:http://www.cubrid.org/blog/dev-platform/how-to-monitor-java-garbage-collection/ 这是"成为GC专家系 ...

  9. java 垃圾回收(堆内存)、以及栈内存的释放

    一.Java的垃圾回收机制———解疑 Java的垃圾回收机制是Java虚拟机提供的能力,用于在空闲时间以不定时的方式动态回收无任何引用的对象占据的内存空间. 需要注意的是:垃圾回收回收的是无任何引用的 ...

  10. Java垃圾回收机制_(转载)

    Java垃圾回收机制 说到垃圾回收(Garbage Collection,GC),很多人就会自然而然地把它和Java联系起来.在Java中,程序员不需要去关心内存动态分配和垃圾回收的问题,这一切都交给 ...

随机推荐

  1. iso移动端input的bug解决(vue)

    iso中input很奇怪,点击空白地方,键盘也不会消失,影响页面中其他功能 解决办法: 点击的元素不是input或者textarea,那么就让上一个获得焦点的输入框失去焦点. 涉及的代码: <i ...

  2. kamailio 云部署 配置NAT

    公有云配置NAT 第一步:将内网ip广播至公网ip,编辑/etc/kamailio/kamailio.cfg文件,搜索listen,添加如下配置 # listen=udp: listen= adver ...

  3. python程序—利用socket监控端口

    利用socket监控服务器端口,端口不通时,发邮件提醒 import yagmail #导入yagmail模块 import re #导入re模块,进行正则匹配 import socket #导入so ...

  4. Jvm类的加载机制

    1.概述 虚拟机加载Class文件(二进制字节流)到内存,并对数据进行校验.转换解析和初始化,最终形成可被虚拟机直接使用的Java类型,这一系列过程就是类的加载机制. 2.类的加载时机 类从被虚拟机加 ...

  5. Java问题解决:"错误:编码GBK 的不可映射字符"

    参考资料:http://blog.csdn.net/l1028386804/article/details/46583279 场景: 在使用javac编译java文件时出现以下错误: 解决方法: 使用 ...

  6. mysql5.7.25安装

    附:mysql安装包 链接:https://pan.baidu.com/s/1vROdBSw0GiMWCRpuwmqFCg 提取码:ug4o a.运行mysql-installer-community ...

  7. Linux压缩与解压缩文件

    1 将tgz文件解压到指定目录. tar zxvf test.tgz -C 指定目录 比如:将 test.tgz 解压到 /home目录:tar zxvf test.tgz -C /home 2 将指 ...

  8. 非阻塞模式(ioctlsocket)

    //Server.cpp #include <stdio.h> #include <winsock2.h> //winsock.h (2种套接字版本) #pragma comm ...

  9. DBlink 创建 删除 脚本

    --配置SQLSERVER数据库的DBLINK --删除dblink Exec sp_droplinkedsrvlogin test,Null Exec sp_dropserver test --创建 ...

  10. mock js使用方法简单记录

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...