JVM架构(011)_java垃圾回收都有哪些方式

转载 2016年08月29日 16:58:15

1、java垃圾回收都有哪些方式

所谓垃圾回收方式,是指JVM提供的几种不同的垃圾回收器,不同的垃圾回收器进行垃圾回收时采用不同的方式。当然,总体原则遵循java垃圾回收机制

了解java内存模型看这里:java内存模型是什么样的 
了解堆内存看这里:java堆内存是什么样的 
了解java垃圾回收机制看这里:java垃圾回收机制是什么

每种方式都有自己的优势与劣势。我们编程的时候可以通过向JVM传递参数来选择垃圾回收器。不同的垃圾回收期有大的不同,可以为我们提供完全不同的应用程序性能,所以理解每种垃圾回收器,并且根据不同的应用选择进行正确的选择是非常重要的

垃圾回收器主要有4种:串行垃圾回收器(Serial Garbage Collector) 
并行垃圾回收器(Parallel Garbage Collector)、并发标记扫描垃圾回收器(CMS Garbage Collector)、G1垃圾回收器(G1 Garbage Collector),具体如下:

串行垃圾回收器

串行垃圾回收器通过持有应用程序所有的线程进行工作。它为单线程环境设计,只使用一个单独的线程进行垃圾回收,通过冻结所有应用程序线程进行工作,所以可能不适合服务器环境。它最适合的是简单的命令行程序。 
通过JVM参数-XX:+UseSerialGC可以使用串行垃圾回收器。

并行垃圾回收器

并行垃圾回收器是JVM的默认垃圾回收器。与串行垃圾回收器不同,它使用多线程进行垃圾回收。相似的是,当执行垃圾回收的时候它也会冻结所有的应用程序线程。

并发标记扫描垃圾回收器

并发标记垃圾回收使用多线程扫描堆内存,标记需要清理的实例并且清理被标记过的实例。并发标记垃圾回收器只会在下面两种情况持有应用程序所有线程:

  1. 当标记的引用对象在老生代
  2. 在进行垃圾回收的时候,堆内存的数据被并发的改变

相比并行垃圾回收器,并发标记扫描垃圾回收器使用更多的CPU来确保程序的吞吐量。如果我们能够为了更好的程序性能分配更多的CPU,那么相比并发垃圾回收器,并发标记扫描垃圾回收器是更好的选择。 
通过JVM参数XX:+USeParNewGC打开并发标记扫描垃圾回收器。

G1垃圾回收器

G1垃圾回收器将堆内存分割成不同的区域,并且并发的对其进行进行垃圾回收。G1也可以在回收内存之后对剩余的堆内存空间进行压缩。 
G1垃圾回收会优先选择第一块垃圾最多的区域,它适用于堆内存很大的情况。 
通过JVM参数–XX:+UseG1GC使用G1垃圾回收器 
在Java 8中,G1可以通过JVM参数-XX:+UseStringDeduplication删除重复的字符串,只保留一个char[]来优化堆内存。

2、如何选择不同的垃圾回收器

我们需要根据应用场景硬件性能吞吐量需求来决定使用哪一种垃圾回收器,通过JVM参数的配置来选择垃圾回收器:

-XX:+UseSerialGC:串行垃圾回收器 
-XX:+UseParallelGC:并行垃圾回收器 
-XX:+UseConcMarkSweepGC:并发标记扫描垃圾回收器 
-XX:ParallelCMSThreads:并发标记扫描垃圾回收器 =为使用的线程数量 
-XX:+UseG1GC:G1垃圾回收器

其他内存常见配置:

-Xms:初始化堆内存大小 
-Xmx:堆内存最大值 
-Xmn:新生代大小 
-XX:PermSize:初始化永久代大小 
-XX:MaxPermSize:永久代最大容量

配置JVM GC参数的实例:

<code class="hljs lasso has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">java <span class="hljs-attribute" style="box-sizing: border-box;">-Xmx1024m</span> <span class="hljs-attribute" style="box-sizing: border-box;">-Xms512m</span> <span class="hljs-attribute" style="box-sizing: border-box;">-Xmn256m</span> <span class="hljs-attribute" style="box-sizing: border-box;">-XX</span>:PermSize<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">64</span>m <span class="hljs-attribute" style="box-sizing: border-box;">-XX</span>:MaxPermSize<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">128</span>m <span class="hljs-attribute" style="box-sizing: border-box;">-XX</span>:<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">+</span>UseSerialGC <span class="hljs-attribute" style="box-sizing: border-box;">-jar</span> java<span class="hljs-attribute" style="box-sizing: border-box;">-application</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>jar</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>

上述配置的含义是: 
堆内存512-1024M,新生代256M,永久代64-128M,采用串行垃圾回收器执行java-application.jar。

Java之美[从菜鸟到高手演变]之JVM内存管理及垃圾回收

很多Java面试的时候,都会问到有关Java垃圾回收的问题,提到垃圾回收肯定要涉及到JVM内存管理机制,Java语言的执行效率一直被C、C++程序员所嘲笑,其实,事实就是这样,Java在执行效率方面确...

【Java】の基础——JVM垃圾回收

Java虚拟机内存区域 程序计数器 Java虚拟机栈 本地方法栈 Java堆 方法区 对象创建过程 类加载检验 分配内存 方法1指针碰撞 方法2空闲列表 在对象头中设置对象信息 对象的内存...

java 图解JVM在内存中申请对象及垃圾回收流程

先看一下JVM的内存模型:     从大的方面来讲,JVM的内存模型分为两大块:   永久区内存( Permanent space )和堆内存(heap space)。   栈内...

Java之美[从菜鸟到高手演变]之JVM内存管理及垃圾回收

很多Java面试的时候,都会问到有关Java垃圾回收的问题,提到垃圾回收肯定要涉及到JVM内存管理机制,Java语言的执行效率一直被C、C++程序员所嘲笑,其实,事实就是这样,Java在执行效率方面确...

Java(JVM)内存模型,垃圾回收

要了解Java垃圾收集机制,先理解JVM内存模式是非常重要的。今天我们将会了解JVM内存的各个部分、如何监控以及垃圾收集调优。 Java(JVM)内存模型 正如你从上面的图片看到的,JVM内存...
  • wq237wq
  • wq237wq
  • 2016年06月02日 16:16
  • 163

Java JVM:垃圾回收(GC 在什么时候,对什么东西,做了什么事情)

转载自https://github.com/pzxwhc/MineKnowContainer/issues/26 参考了 一个面试官对面试问题的分析 中关于 GC 的分析,垃圾回收需要搞清楚...

Java之美[从菜鸟到高手演变]之JVM内存管理及垃圾回收

很多Java面试的时候,都会问到有关Java垃圾回收的问题,提到垃圾回收肯定要涉及到JVM内存管理机制,Java语言的执行效率一直被C、C++程序员所嘲笑,其实,事实就是这样,Java在执行效率方面确...

Java JVM 8:垃圾回收(GC 在什么时候,对什么东西,做了什么事情)

在什么时候首先需要知道,GC又分为 minor GC 和 Full GC (也称为 Major GC )。Java 堆内存分为新生代和老年代,新生代中又分为1个 Eden 区域 和两个 Survivo...

Java之美[从菜鸟到高手演变]之JVM内存管理及垃圾回收

一、JVM内存的构 Java虚拟机会将内存分为几个不同的管理区,这些区域各自有各自的用途,根据不同的特点,承担不同的任务以及在垃圾回收时运用不同的算法。总体分为下面几个部分: 程序计数器(Prog...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:JVM架构(011)_java垃圾回收都有哪些方式
举报原因:
原因补充:

(最多只允许输入30个字)