JVM扫盲(一)

Resource From baeldung.com: [NOTE: 介绍JVM、简单使用]html

1、JVM Garbage Collectors (java 平台的垃圾收集器)java

  1. 概览

在这篇快速指导中, 咱们会说说不一样JVM 的GC实现的基础。 除此以外, 咱们会找出怎样在本身的应用中启用一款适用应用的GC。程序员

  1. 简单介绍GC

顾名思义, GC就像是一个带有发现并删除内存垃圾的垃圾回收处理。但是,现实中,GC会跟踪每一个JVM 堆空间的对象,并在适当的时候移除没有用处的对象。简单来讲, GC工做方式分为2步: 标记、清除后端

标记: GC会标记哪块内存是可用的, 哪些是不可用的;
清除:这一步会移除有标记的对象。

优势:数组

因为没用的内存空间会被GC自动处理,故无需手动作分配或者释放内存的处理

没有处理(悬空[dangling])指针的开销

自动内存泄漏管理(GC不能确保完美无缺的解决方案来处理内存泄漏, 可是它会倾尽全力)

缺点:多线程

因为JVM必须追踪对象引用的建立和删除, GC使得除了部署应用须要消耗资源,还须要更多的CPU资源。这可能会影响到请求的性能, 尤为是一些须要大量内存的请求。

程序员没法控制专门用于释放再也不须要的对象在CPU时间片的调度。

用一些GC实现可能会致使应用意外终止。

自动内存管理不如手动内存分配/释放内存更有效。
  1. GC实现

JVM 有4种类型的GC实现: 串行GC, 并行GC, CMS GC, G1 GC。 Ok 接下来一一介绍这几类GC 实现oracle

串行GC(Serial Garbage Collector):

	串行GC是最简单的GC实现, 由于它基本上是以单线程工做。 所以, 此类GC在处理内存垃圾的时候,会暂停当前应用全部的线程。 因此, 对于在多线程应用中(好比 服务后端应用), 这并非一个很好的GC实现。 但是, 有一个比较有意思的观点: 串行GC可让人更好地理解垃圾回收器。串行 gc 是大多数应用程序的首选垃圾收集器, 这些应用程序没有较小的暂停时间要求, 而且在以客户端的计算机上运行。用串行GC 的命令: java -XX:+UseSerialGC -jar Application.java

并行GC(Parallel Garbage Collector):

	并行GC 是JVM默认的GC, 又是叫作吞吐量回收器。不像串行GC, 它使用了多线程来管理heap space. 可是它也会在执行GC的时候,冻结应用线程。若是用这个GC, 能够设置最大的GC线程、pause time(暂停时间)、吞吐量、占用(堆大小)。 

	GC线程数目也能够用命令行控制 -XX:ParallelGCThreads=<N>.

	最大的暂停时间目标(以毫秒为单位的2个GC的时间间隔)也能够用命令行设定,以毫秒为单位作设置 -XX:MaxGCPauseMillis=<N>.

	最大的吞吐目标(以一个比值衡量GC吞吐率: 作GC用的时间/不作GC用的时间)也能够用命令行设定 -XX:GCTimeRatio=<N>.

	最大的堆占用量(程序运行时所须要的堆内存占用量) 能够用JVM参数设置:  -Xmx<N>

	为了开启并行GC 可使用以下命名启动java application: java -XX:+UseParallelGC -jar Application.java

CMS GC(CMS Garbage Collector):

	并行标记清除(CMS)的实现使用了多个gc 线程来作GC工做。这个GC实现侧重于更短的gc停顿时间的应用, 而且在应用运行的时候,应用也能够和gc一块儿分享处理器资源。

	简单地说, 用这个类型的应用平均响应时间比较慢, 可是不会中止响应去执行GC。

	这里须要注意的是, 因为GC是并行的,当GC并行垃圾回收时, 手动调用gc, 好比 System.gc()会致使并行模式[失败/打断]。

	若是超过98%的时间都用于CMS GC 而且少于2%的堆被回收, 那么CMS gc实现会抛出OOM。 必要的时候, 这个特征也能够命令行禁止 -XX:+UseGCOverheadLimit.

	垃圾回收器也有一个模式叫作: 增加式模式,可是在java se 8中已通过时了, 在将来主打版本中可能被移除。

	开启CMS GC, 可用以下命名: java -XX:+UserParNewGC -jar Application.java

G1 GC(G1 Garbage Collector):

	G1(优先回收)GC 旨在服务于那些运行在多核CPU而且大容量内存机器上的应用。 这个GC实现从JDK7及之后版本可用。

	因为高性能,G1 回收器会替代CMS GC。

	不像其余的GC, G1会把堆分区成若干同等大小的堆块, 每一个堆块都有一个连续的虚拟内存的合理区间。当执行GC时, G1会进行并行放入全局性标记阶段(好比 phase 1 意为Marking[标记]) 来决定在整个heap中的全部对象的存活时间。

	标记阶段完成后, G1就会知道哪些区域大多数是空的。它首先会收集这些区域, GC后这些区域一般会空出一大片区域(phase 2 意为清除)。这就是为何此GC实现方法叫作Garbage-First.

	开启G1 GC 的命令: java -XX:+UseG1GC -jar Application.java
  1. java 8 对于GC的变化app

    java8 已经引入了不少JVM参数不须要用内存来建立大量相同的String。 它是经过移除重复String值变成全局单一的数组char[]来优化了堆内存。性能

  2. 结论优化

    本次快速指引中, 主要介绍了JVM GC 实现和他们的用法。对于几种GC实现的使用和调整,参见 https://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html

相关文章
相关标签/搜索