码迷,mamicode.com
首页 > 其他好文 > 详细

JVM

时间:2016-03-14 18:51:09      阅读:219      评论:0      收藏:0      [点我收藏+]

标签:

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回收器:

 (未完待续)

JVM

标签:

原文地址:http://www.cnblogs.com/gsf-blog/p/4858876.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!