这里以jdk1.8做讲解。Jdk1.8的分代去掉了永久代,只分为新生代(有的也译为年轻代)和年老代。

名词解释:

系统吞吐量:用于处理应用程序处理事务的线程数与用于GC的线程数的比。

pause time:进行GC时,暂停处理应用程序事务线程的时间。

JVM运行内存别分为新生代和年老代。新生代包含一个Eden区和两个Survivor区。如图:

个人理解的GC过程:

新生代发生Minor GC,Minor GC在Eden区通过标记—清除算法(上节讲的GC算法),得到存活的对象。如果存活的对象大小小于Survivor区,则将存活对象复制到一个空闲的Survivor区,且清空另一个Survivor区(两个Survivor区永远有一个是空闲的);反之,则会将这些存活对象直接复制到年老代。另外新生代的每个对象都有个复制次数值,当一个存活对象到达一定阈值后,也会将其从新生代复制到年老代。

下面我们具体讲解下GC Collectors。进行GC时都会产生暂停应用程序的线程(对内存中的对象进行标记),产生暂停时间(pause time),进行垃圾回收。

The Serial Collector(串行GC):其命令为-XX:+UseSerialGC.。只使用一个线程进行GC,适用于单线程的服务器,或者小数据集(100M)的小应用程序。GC过程如图:

The Parallel Collector(并行GC):其命令为-XX:+UseParallelGC。默认使用的回收机制,它会根据参数,字段调整内存大小。它主要目标是为了提高系统吞吐量(用于处理应用程序处理事务的线程数与用于GC的线程数的比。),它与串行GC相似,主要区别就是它会用多个线程进行GC,缩短了the pause time. 虽然它常被认为是保障系统吞吐量的垃圾回收机制,不过它也可以使用-XX:MaxGCPauseMillis=n参数来限制the pause time。GC过程如图:

不过The Parallel Collector(并行GC)一般设置-XX:MaxGCPauseMillis参数,因为系统如果对the pause time有要求,可以使用The Concurrent Mark Sweep (CMS) collector .

The Concurrent Mark Sweep collector(CMS GC):其命令为-XX:+UseConcMarkSweepGC。它主要目标是为了缩短the pause time.它分为两个阶段mark – Sweep。所以它有两个暂停时间,但时间都很短。GC过程如图:

Garbage-First Garbage Collector(G1 GC):其命令为-XX:+UseG1GC。这个回收机制用于多核,且大内存服务器。它是为满足the pause time ,同时也满足系统吞吐量而设计。它可以同时进行新生代和年老代的垃圾回收,它也对大对象的内存分配和回收做了特殊处理。

经验:

  1. 设置-Xmx,限制最大内存,以防服务器系统崩溃。
  2. 设置好最大内存后,调整参数,使年老代的使用率在70%-90%。

另外,满足以下条件时,不建议花费精力去调整GC:

1.一次Minor GC耗时在50ms内。

2.Minor GC的周期在10s以上。

3.一次Full GC耗时在1s内。

3.Full GC的周期在10分钟以上。

四.GC —三分钟认识JAVA回收机制(Java Garbage Collection)的更多相关文章

  1. python垃圾回收机制(Garbage collection)

    由于面试中遇到了垃圾回收的问题,转载学习和总结这个问题. 在C/C++中采用用户自己管理维护内存的方式.自己管理内存极其自由,可以任意申请内存,但也为大量内存泄露.悬空指针等bug埋下隐患. 因此在现 ...

  2. 简要描述Python的垃圾回收机制(garbage collection)

    这里能说的很多.你应该提到下面几个主要的点: Python在内存中存储了每个对象的引用计数(reference count).如果计数值变成0,那么相应的对象就会小时,分配给该对象的内存就会释放出来用 ...

  3. python面试题之简要描述Python的垃圾回收机制(garbage collection)

    这里能说的很多.你应该提到下面几个主要的点: Python在内存中存储了每个对象的引用计数(reference count).如果计数值变成0,那么相应的对象就会小时,分配给该对象的内存就会释放出来用 ...

  4. [转载]JVM 垃圾回收机制(Garbage Collection)

    相关算法: 引用计数法 引用可达法 尚学堂 参考:http://www.sxt.cn/Java_jQuery_in_action/Principle_and_algorithm_of_garbage_ ...

  5. Java回收机制概述

    Java技术体系中所提倡的 自动内存管理 最终可以归结为自动化地解决了两个问题:给对象分配内存 以及 回收分配给对象的内存,而且这两个问题针对的内存区域就是Java内存模型中的 堆区. 垃圾回收机制的 ...

  6. JavaScript--我发现,原来你是这样的JS(四)(看看变量,作用域,垃圾回收机制是啥)

    一.介绍 这是红宝书(JavaScript高级程序设计 3版)的读书笔记第四篇,是红宝书第四章内容(主要是变量和作用域问题),当然其中还有我个人的理解.红宝书这本书可以说是难啃的,要看完不容易,挺厚的 ...

  7. JS--我发现,原来你是这样的JS(四)(看看变量,作用域,垃圾回收机制是啥)

    一.介绍 这是红宝书(JavaScript高级程序设计 3版)的读书笔记第四篇,是红宝书第四章内容(主要是变量和作用域问题),当然其中还有我个人的理解.红宝书这本书可以说是难啃的,要看完不容易,挺厚的 ...

  8. PythonStudy——内存管理之垃圾回收 Memory management Garbage collection

    内存管理 引用计数:垃圾回收机制的依据 # 1.变量的值被引用,该值的引用计数 +1# 2.变量的值被解绑,该值的引用计数 -1# 3.引用计数为0时就会被垃圾回收机制回收 标记清除:解决循环引用问题 ...

  9. hive impala C++ Java垃圾回收 Garbage Collection GC

    hive impala impala  推荐每个节点内存  2^7~2^8GB Impala与Hive的比较 - 文章 - 伯乐在线 http://blog.jobbole.com/43233/ &l ...

随机推荐

  1. SICP-1.7-递归函数

    递归函数 函数内部直接或间接的调用函数自身 将复杂问题简单化 例子程序 def sum_digits(n): """Return the sum of the digit ...

  2. 前端UI组件复用工具

    "懒"是第一生产力. 代码复用总是程序员喜闻乐见的,前端组件化的最终目的就是复用,今天我们就将深入探讨如何实现UI组件的复用. 通常我们所说的组件往往是包含业务逻辑的前端组件,而这 ...

  3. java wait 和notify

    这几天自己学习了一下线程的知识,wait 方法使当前的线程等待,notify 方法 唤醒当前的线程的方法 th 线程在5的时候进行wait,此时主线程继续执行, 主线程执行到9的时候 唤醒 th 线程 ...

  4. 警惕System.Environment.CurrentDirectory 获取当前目录

    最近工作中,要做个客户端提醒的小工具:winform程序自然少不了要读取和应用程序同一个目录的配置文件(不是exe.config文件): 要读取当前应用程序所在目录我立马想到了System.Envir ...

  5. 发布.NET MVC网站 到Azure

    最近的项目部署在Microsoft Azure,学习了一些新东西,记录下. 1.账号. 用于登录portal(https://portal.azure.cn/),账号下有对应的Subscription ...

  6. Vue和Bootstrap的整合之路

    我是一个刚刚接触前端开发的新手,所以有必要记录如何将Bootstrap和Vue进行整合. 如果你是老手,请直接绕道而过.作为一个新手,里面的步骤,过程或者专业术语未必正确,如果你发现哪里错误了,请发邮 ...

  7. 【Android Developers Training】 73. 布局变化的动画

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  8. tab切换实现方式2

    tab切换实现方式2: <!DOCTYPE html> <html lang="en"> <head> <meta charset=&qu ...

  9. 【SEO】搜索引擎优化的陷阱和作弊

    一.认识SEO [理解] 站内优化是指更改网站内部结构,让网站利于蜘蛛爬取,比如网站内容: 站外优化是指发反向链接,给蜘蛛一个爬取你网站的通道. 其中,反向链接是指网页A 上有一个链接指向网页B,则网 ...

  10. MinGW(GCC)编译DLL文件

    这两天用CB(Code::Blocks)写个小程序,要编译出DLL供VB(6)使用.CB使用mingw-gcc作为编译器,在库文件的产出上跟VC.VS之类的IDE略有不同. 由于C语言的基础知识不是太 ...