标签:
public class 虚拟机入门{ public static void main(String[] args){ String 目录 = "目录";
switch (目录) {
case "目录":System.out.println("目录:");
case "一": System.out.println("一、Java虚拟机的结构");
case "二": System.out.println("二、常用配置参数");
case "三": System.out.println("三、垃圾回收的基本概念及基本算法");
case "四": System.out.println("四、垃圾收集器");
default:
break;
}
System.out.println("未完待续:性能监控!"); } }
一、Java虚拟机的结构
Java栈:
栈深度:StackOverflowError 异常
内存:OutOfMemoryError 异常
方法区:
它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据
二、常用配置参数
-Xms:最小值
-Xmx:最大值
-Xmn:新生代大小
-XX:SurvivorRatio:Enden : Survivor
-XX:NewRatio:老年代:年轻代
三、垃圾回收的概念及算法
(1)为什么要关注垃圾回收?
C++垃圾回收机制: Java垃圾回收机制:
干净利索!但是很累! 轻松愉快!但是。。。
(2)垃圾标识算法:引用计数法和可达性检测法
(3)垃圾回收基础算法:标记清除法(Mark-Sweep)、复制算法(Copying)、标记整理算法(Mark-Compact)
(4)可达性强度:强引用,软引用,弱引用,虚引用
强:。当内存空 间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足问题。
软:如果内存空间足够,垃圾回收器就不会回收它,如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。软引用可用来实现内存敏感的高速缓存。
弱:弱引用与软引用的区别在于:只具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它 所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。不过,由于垃圾回收器是一个优先级很低的线程, 因此不一定会很快发现那些只具有弱引用的对象。
虚:"虚引用"顾名思义,就是形同虚设,与其他几种引用都不同,虚引用并不会决定对象的生命周期。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收。
虚引用主要用来跟踪对象被垃圾回收的活动。
http://blog.csdn.net/lengyuhong/article/details/6398184
(5)Stop-The-World!
四、垃圾收集器
上面介绍的垃圾回收算法仅仅是回收垃圾的方法而已,而垃圾回收器则是这些方法的执行者。在Java虚拟机中有好多种垃圾回收器,它们在后台默默地回收着程序猿代码中制造的内存垃圾,我称这些内存垃圾为“猿粪”。
使用Java编程,可以不必关心垃圾的具体回收过程,但是必须了解每种垃圾回收器的用途特点,因为它们会影响到你的程序性能。
从实现特点上来将回收器分为以下四类:
(1)串行回收器:新生代,老年代
(2)并行回收器:新生代,老年代
(3)CMS回收器:老年代
(4)G1 回收器:新生代,老年代
(1)串行垃圾回收器:1>新生代串行回收器;2>老年代串行回收器.
特点:串行回收器的特点是:1> 仅仅使用单线程进行垃圾回收。 2> 独占式垃圾回收。
在串行收集器进行垃圾回收的时候,Java应用程序中的线程都需要暂停,等待垃圾回收的完成,即出现“Stop-The-World”。
分:根据作用域不同,分为新生代串行回收器和老年代串行回收器。
新生代串行回收器:作用于新生代,采用的是复制算法。
老年代串行回收器:作用于老年代,采用的是标记清除算法。同时这种回收器也是CMS回收器的备用回收器。
优:实现简单,逻辑处理特高效,且没有线程切换开销。一心一意做一件事。在单CPU等硬件平台不是很优越的情况下,它的性能可以超过并行回收器和并发回收器。
劣:在堆空间较大的应用程序中,一旦老年代串行回收器启动,则可能会导致程序停顿比较长的时间。
配置:有关串行回收器的配置,(只要新代和老代中有一个使用了串行回收器,就算):
-XX:+UseSerialGC 新生代和老年代都是用串行回收器
-XX:+UseParNewGC 新生代使用ParNew回收器,老年代使用串行回收器
-XX:+UseParallelGC 新生代使用ParallelGC回收器,老年代使用串行回收器
注意:当虚拟机在Client模式下的时候,串行回收器是默认的回收器。
(2)并行回收器:1>新生代ParNew回收器;2>新生代ParallelGC回收器;3>老年代ParallelOldGC回收器.
特点:相较于串行回收器,它采用多个线程同时进行垃圾回收。但是也是独占式的回收,即在回收线程结束之前,应用程序的所有线程都暂停工作。
分:根据作用域和关注点不同,分为三种
1>新生代ParNew回收器:作用于新生代,也是采用复制算法。由于是多线程的,所以在并发能力强的CPU上,停顿时间要比新生代串行回收器短。其实跟新生代串行回收器的区别就在于线程数量和名字不一样而已。
2>新生代Parallel回收器:作用于新生代,也是采用复制算法。从表面上看跟ParNew回收器一样,多线程,独占式。但是它自认为是能力出众的,因为它有自己的特点。
新生代Parallel回收器关注的是系统的吞吐量。它会在运行的时候自适应地调整Java堆大小以及其他一些参数。(它是智能的,支持一种自适应的GC调整策略,而ParNew就不会。)
可以通过两个参数来控制系统吞吐量:
-XX:MaxGCPauseMillis 设置最大垃圾收集停顿时间(>0)。注意这是单次回收停顿时间。Parallel会在工作时候自适应地调整Java堆大小和其他一些参数来满足停顿时间。所以它就可能会将堆设置为小一点,这样虽然满足了单次回收的停顿时间在MaxGCPauseMillis内,但是会导致垃圾回收很频繁!从而增加了垃圾回收的总时间,而降低了吞吐量!
-XX:GCTimeRatio 设置吞吐量大小(0~100)。什么是吞吐量?将Java程序的执行时间分为停顿时间和执行时间,吞吐量就是执行时间占程序执行总时间的比例。如果将吞吐量设为n,则系统将花费不超过1/(1+n)的时间用于垃圾收集。默认值为99,即不超过1/(1+99)=1%的时间用于垃圾收集。
注意:MaxGCPauseMillis和GCTimeRatio是互斥的。
3>老年代ParallelOld回收器:作用于老年代,采用标记压缩算法。跟ParallelGC的区别就是作用域和算法不同。
配置:关于并行回收器(3种),相关配置如下:
-XX:+UseParNewGC 新生代用ParNew回收器,老年代用串行回收器
-XX:+UseConcMarkSweepGC 新生代用ParNew回收器,老年代用CMS回收器
-XX:+UseParallelGC 新生代用ParallelGC回收器,老年代用串行回收器
-XX:+UserParallelOldGC 新生代用ParallelGC回收器,老年代用ParallelOldGC回收器
另:-XX:ParallelGCThreads 设置并行回收的线程数量
(3)CMS回收器:
特点:作用于老年代。不是独占式的回收器。与ParallelGC、ParallelOldGC不同的是,CMS回收器关注的是系统停顿时间!
CMS = Concurrent Mark Sweep, 即并发标记清除。采用的是标记清除算法。
工作步骤:CMS回收器的主要工作步骤分为6个步骤。初始标记、并发标记、预清理、重新标记、并发清除和并发重置。
虽然分了六个步骤但是整体上还是做了标记,然后清除的工作。如下图所示,其中STW是Stop-The-World。
为什么CMS不是独占式的回收器?
因为在并发标记、预清理、并发清除和并发重置阶段,CMS是可以与用户线程一起执行的,即并发执行,只有预标记和重新标记阶段会StopTheWorld。所以从整体上来将CMS是非独占式的回收器。
注意:CMS回收器为了降低系统停顿时间,在并发标记、预清理、并发清理、并发重置阶段是可以和用户线程一起执行的,这就导致在CMS回收过程中,应用程序可能又新产生了垃圾。这些新生成的垃圾在当前CMS回收过程中是无法被清除的。同时,要保证应用程序留有足够内存保证CMS回收器的运行。也正因为此,CMS回收器不会等待内存饱和了之后才开始回收,而是当内存使用率达到一定的阈值时候就开始进行回收了。
同理,若在回收过程中应用程序的内存使用率增加较快,而导致CMS执行过程中出现了内存不足的情况,此时CMS回收就会失败,这个时候虚拟器将启动备用收集器,老年代串行收集器进行垃圾回收!
优:因为CMS回收器产生的系统停顿时间比较短,所以非常适合用于服务器端,满足其快速响应的需求。
劣:CMS是基于标记清除算法,所以可能会会产生大量内存碎片。但是CMS收集器可以整理碎片的。
-XX:+UseCMSCompactAtFullCollection 可以使得CMS在垃圾收集完之后,进行一次内存碎片的整理。
配置:
-XX:+UseConcMarkSweepGC,新生代使用ParNew回收器,老年代使用CMS回收器。
(4)G1回收器:
(未完待续)
标签:
原文地址:http://www.cnblogs.com/gsf-blog/p/4858876.html