一.基本垃圾回收算法

1.引用计数(Reference Counting)

比较古老的回收算法。原理是此对象有一个引用则增加一个引用计数,删除一个引用则较少一个引用计数。垃圾回收时,只回收引用计数为0的对象。此算法最致命的是无法处理互相引用的问题。

2.标记-清除(Mark-Sweep)

此算法执行分两个阶段。第一个阶段是从根节点开始标记所有被引用的对象;第二个阶段遍历整个堆,把未标记的对象清除。此算法需要暂停整个应用,并且会产生内存碎片。

3.复制(Copying)

此算法把内存空间划分为2个相同的区域,每次只使用其中一个区域。垃圾回收时,区域A从根开始访问每一个关联的正在使用的对象,并且把正在使用的对象复制到另外一个区域B,然后回收区域A中所有对象。此算法只访问活跃对象,所以遍历空间成本低,但是此算法的缺点也很明显,就是需要2倍内存空间。

4.标记-整理(Mark-Compact)

此算法也是分两个阶段。第一个阶段是从根节点开始标记所有被引用的对象;第二阶段遍历整个堆,清除未被标记的对象并且把标记的对象(正在使用的对象)压缩到一起按顺序存放。此算法避免了“标记-清除”算法中的内存碎片问题,并且也避免了“复制”算法的空间问题。

二.JVM内存模型。

1.基础概念

(1)JVM内存限制(最大值):

JVM内存的最大值跟操作系统有很大的关系。简单的说32位操作系统虽然可控内存有4GB,但是操作系统会给一个限制,Windows下为2GB,Linux下为3GB,而64位及以上的操作系统没有限制。

(2)JVM默认内存分配:

JVM初始分配的内存由-Xms指定:默认是物理内存的1/64但是小于1GB。

JVM最大分配的内存有-Xmx指定:默认是物理内存的1/4但是小于1GB。

(3)JVM内存自动调整:

默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx限制,可以由-XX:MinHeapFreeRatio=指定。

默认空余堆内存大于70%时,JVM就是减少堆直到-Xms限制,可以由-XX:MaxHeapFreeRatio=指定。

但是服务器一般都设置-Xms、-Xmx相等以避免每次gc后都调整堆的大小,所以这两个参数一般没什么作用。

2.堆(Heap)和非堆(Non-heap)内存

(1)堆(Heap)

(2)非堆(Non-heap)

参考文档:

http://www.cnblogs.com/redcreen/tag/jvm/

http://chenchendefeng.iteye.com/blog/455883

http://www.open-open.com/lib/view/open1324736648468.html

http://vanadiumlin.iteye.com/blog/1267857

JVM参数:

1、JVM堆相关参数

参数 说明 备注
-Xmx

设置最大堆内存

一般-Xmx与-Xms设置相同

-Xms

设置最小堆内存

 
-Xmn

设置新生代内存大小

-Xmn等同于设置了相同的-XX:NewSize与-XX:MaxNewSize

-XX:NewSize

设置新生代初始大小

 
-XX:MaxNewSize 设置新生代最大值  
-XX:PermSize 设置持久代初始大小 用于JDK8 之前
-XX:MaxPermSize 设置持久代的最大值 用于JDK8 之前
-XX:MetaspaceSize 设置持久代初始大小 用于JDK8之后,包含JDK8
-XX:MaxMetaspaceSize 设置持久代的最大值 用于JDK8之后,包含JDK8
-Xss 设置线程栈的大小 线程栈所占内存不是堆内存,是操作系统内存减去堆内存
-XX:MinHeapFreeRatio 设置堆空间最小空闲比例 当堆空间的空闲内存小于这个数值时,JVM便会扩展堆空间,默认值40
-XX:MaxHeapFreeRatio 设置堆空间最大空闲比例 当堆空间的空闲内存大于这个数值时,JVM便会压缩堆空间,得到一个较小的堆,默认值70
-XX:NewRatio 设置老年代与新生代比例 等于老年代大小除以新生代大小
-XX:SurviorRatio 新生代中Eden与survivor区的比例  
-XX:TargetSurvivorRatio 设置survivor区的使用率 当survivor区的空间使用率达到这个数值时,会将对象送入老年代,默认值50,最高90
     

2、JVM垃圾收集器相关参数

参数 说明 备注
 -XX:+CMSClassUnLoadingEnabled  允许对类元数据进行回收  
 -XX:CMSInitiatingPermOccupancyFraction  当永久代占用率达到这一百分比时,启动CMS回收  前提是-XX:+CMSClassUnLoadingEnabled激活了
 -XX:UseCMSInitiatingOccupancyOnly  表示只在达到阈值的时候,才进行CMS回收  
 -XX:+CMSIncrementalMode  使用增量模式,比较适合单CPU  

3、实用JVM参数

参数 说明 备注
-XX:+HeapDumpOnOutOfMemoryError 当程序发生OOM时,导出应用程序当前堆快照  
-XX:HeapDumpPath 可以指定堆快照的保存位置

-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/Users/yangyu/Downloads

-XX:OnOutOfMemoryError 系统发生OOM错误时可运行一段第三方脚本

-XX:OnOutOfMemoryError=c:\reset.bat

-verbose:gc 获取gc信息  
-XX:+PrintGC 获取gc信息  
-XX:+PrintGCDetails 获取gc详细信息  
-XX:+PrintHeapAtGC gc时打印详细的堆信息  
-Xloggc 将gc信息保存到文件 -Xloggc:/Users/yangyu/Downloads/gc.log
-XX:+TraceClassLoading 用于跟踪类加载情况  
-XX:+TraceClassUnLoading 用于跟踪类卸载情况  
-verbose:class 用于跟踪类加载和卸载情况  
-XX:+DisableExplicitGC 用于禁止显示的gc操作 也就是禁止代码里面的System.gc()

JVM垃圾回收(GC)原理的更多相关文章

  1. 性能测试三十五:jvm垃圾回收-GC

    垃圾回收-GC 三个问题 哪些内存需要回收? 什么时候回收? 如何回收? YoungGC和FullGC: 新生代引发的GC叫YoungGC 老年代引发的GC叫FullGC FullGC会引起整个Jvm ...

  2. .NET垃圾回收(GC)原理

    作为.NET进阶内容的一部分,垃圾回收器(简称GC)是必须了解的内容.本着“通俗易懂”的原则,本文将解释CLR中垃圾回收器的工作原理. 基础知识 托管堆(Managed Heap) 先来看MSDN的解 ...

  3. JVM 垃圾回收GC Roots Tracing

    1.跟搜索算法: JVM中对内存进行回收时,需要判断对象是否仍在使用中,可以通过GC Roots Tracing辨别. 定义: 通过一系列名为”GCRoots”的对象作为起始点,从这个节点向下搜索,搜 ...

  4. JVM垃圾回收(GC)流程

    /* 首先介绍一下JVM中堆内存的组成: JVM堆内存主要由三部分组成: (1)新生代: 伊甸园区,存活区,伸缩区 (2)老年代: 老年区,伸缩区 (3)元空间(永久代): 元空间,伸缩区 注意:JD ...

  5. JVM垃圾回收——GC

    一.JVM内存分配与回收 下图为堆内存结构图(注意:元数据区(MetaData )实际上不属于堆): 1.对象优先在Eden区分配 大多数情况下,对象在新生代中Eden区分配.当Eden区没有足够空间 ...

  6. JVM垃圾回收GC

    1.堆的分代和区域 (年轻代)Young Generation(eden.s0.s1  space)    Minor GC (老年代)Old Generation (Tenured space)   ...

  7. JVM—垃圾回收GC算法

    1 GC算法简介 算法 特点 标记-清除 分为"标记"和"清除"两个阶段 复制 可以解决效率问题,将可用的内存按容量划分为大小相等的两块. 标记-整理 先标记. ...

  8. JVM 及 垃圾回收机制原理

    JVM Java 虚拟机 Java 虚拟机(Java virtual machine,JVM)是运行 Java 程序必不可少的机制.JVM实现了Java语言最重要的特征:即平台无关性.原理:编译后的 ...

  9. jvm垃圾回收原理(转)

    原文链接:jvm垃圾回收原理 在jvm中堆空间划分为三个代:年轻代(Young Generation).年老代(Old Generation)和永久代(Permanent Generation).年轻 ...

  10. Java:JVM垃圾回收(GC)机制

    JVM垃圾回收算法 1.标记清除(Mark-Sweep) 原理: 从根集合节点进行扫描,标记出所有的存活对象,最后扫描整个内存空间并清除没有标记的对象(即死亡对象)适用场合: 存活对象较多的情况下比较 ...

随机推荐

  1. 小型文件数据库 (a file database for small apps) SharpFileDB

    小型文件数据库 (a file database for small apps) SharpFileDB For english version of this article, please cli ...

  2. 翻译-使用Ratpack和Spring Boot打造高性能的JVM微服务应用

    这是我为InfoQ翻译的文章,原文地址:Build High Performance JVM Microservices with Ratpack & Spring Boot,InfoQ上的中 ...

  3. Docker实践:运行Python应用

    本文将使用fig应用编排实现一个python的计数器,并使用web展示. 阅读本文您需要具备以下知识: 1.了解Python 2.熟练Docker基础知识(包括Dockerfile语法) 3.了解Do ...

  4. CentOS On VirtualBox

    背景 后台开发需要随时与服务器交互,本人使用Mac开发.但是不愿意在Mac上直接安装redis以及mysql等等工具.所以选择在VirtualenvBox下安装一个服务器系统,并且使用ssh与其连接. ...

  5. Laravel 5.3 请求处理管道详解

    对于一个Web应用来说,在一个请求真正处理前,我们可能会对请求做各种各样的判断,然后才允许后续处理. 我们通常的做法: Script 01.php Script 02.php 优点:直观,容易理解 缺 ...

  6. Javascript算法系列之快速排序(Quicksort)

    原文出自: http://www.nczonline.net/blog/2012/11/27/computer-science-in-javascript-quicksort/ https://gis ...

  7. AngularJS之Service(四)

    前言 前面我们讲了控制器.过滤器以及指令,这一节我们来讲讲重大内容之一服务和其中涉及到的工厂. 话题 AngularJS中服务可以说是和DI紧密联系在一起,在应用程序中我们可以通过使用服务来共享代码, ...

  8. android图片透明度跟缩放大小动画事件

    概序 : 动画事件写在xml中,然后用AnimationUtils去加载动画事件,再监听动画结束事件,隐藏imageview. 1. player_double_click_animation.xml ...

  9. 使用Genymotion调试出现错误INSTALL_FAILED_CPU_ABI_INCOMPATIBLE解决办法

    需要下载Genymotion-ARM-Translation_v1.1.zip  ARM插件包 用于安装ARM架构的程序,将下载好的zip包用鼠标拖到虚拟机窗口中,出现确认对跨框点OK就行.然后重启你 ...

  10. JavaScript的Tab切换

    在网页设计中经常要用到tab切换,遂整理了一下常用的两种方法. 先看一下示例代码: HTML: <!doctype html> <html lang="en"&g ...