`
liudeh_009
  • 浏览: 239758 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

JVM的体系结构和垃圾回收机制

    博客分类:
  • JDK
阅读更多

java虚拟机的体系结构图:



 

JVM内存区域介绍

  堆(Heap)

       Heap是大家最为熟悉的区域,它是JVM用来存储对象实例以及数组值的区域,可以认为Java中所有通过new创建的对象的内存都在此分配,Heap中的对象的内存需要等待GC进行回收,Heap在32位的操作系统上最大为2G,在64位的操作系统上则没有限制,其大小通过-Xms和-Xmx来控制,-Xms为JVM启动时申请的最小Heap内存,默认为物理内存的1/64但小于1G,-Xmx为JVM可申请的最大Heap内存,默认为物理内存的1/4,默认当空余堆内存小于40%时,JVM会增大Heap的大小到-Xmx指定的大小,可通过-XX:MinHeapFreeRatio=来指定这个比例,当空余堆内存大于70%时,JVM会将Heap的大小往-Xms指定的大小调整,可通过-XX:MaxHeapFreeRatio=来指定这个比例,但对于运行系统而言,为了避免频繁的Heap Size的大小,通常都会将-Xms和-Xmx的值设成一样,因此这两个用于调整比例的参数通常是没用的.堆内存大小(-Xmx)=Young区大小(-Xmn)+old区大小

 

  方法区

     方法区域存放了所加载的类的信息(名称、修饰符等)、类中的静态变量、类中定义为final类型的常量、类中的Field信息、类中的方法信息,当开发人员在程序中通过Class对象中的getName、isInterface等方法来获取信息时,这些数据都来源于方法区域,可见方法区域的重要性。同样,方法区域也是全局共享的,它在虚拟机启动时在一定的条件下它也会被GC,当方法区域需要使用的内存超过其允许的大小时,会抛出OutOfMemory的错误信息。

     在Sun JDK中这块区域对应的为PermanetGeneration,又称为持久代,默认为64M,可通过-XX:PermSize以及-XX:MaxPermSize来指定其大小。

 

栈(VM Stack)

     JVM栈是线程私有的,每个线程创建的同时都会创建JVM栈,JVM栈中存放的为当前线程中局部基本类型的变量(java中定义的八种基本类型:boolean、char、byte、short、int、long、float、double)、部分的返回结果以及Stack Frame,非基本类型的对象在JVM栈上仅存放一个指向堆上的地址,因此Java中基本类型的变量是值传递,而非基本类型的变量是引用传递,Sun  JDK的实现中JVM栈的空间是在物理内存上分配的,而不是从堆上分配。

      由于JVM栈是线程私有的,因此其在内存分配上非常高效,并且当线程运行完毕后,这些内存也就被自动回收。

      当JVM栈的空间不足时,会抛出StackOverflowError的错误,在Sun JDK中可以通过-Xss来指定栈的大小

 

  程序计数器

       PC寄存器是一块很小的内存区域,主要作用是记录当前线程所执行的字节码的行号。字节码解释器工作时就是通过改变当前线程的程序计数器选取下一条字节码指令来工作的。任何分支,循环,方法调用,判断,异常处理,线程等待以及恢复线程,递归等等都是通过这个计数器来完成的。

       由于Java多线程是通过交替线程轮流切换并分配处理器时间的方式来实现的,在任何一个确定的时间里,在处理器的一个内核只会执行一条线程中的指令。因此为了线程等待结束需要恢复到正确的位置执行,每条线程都会有一个独立的程序计数器来记录当前指令的行号。计数器之间相互独立互不影响,我们称这块内存为“线程私有”的内存。

       如果所调用的方法为native的,则PC寄存器中不存储任何信息

 

 

常见几种垃圾回收器

     串行收集器:

         串行收集器使用单线程处理所有垃圾回收工作,由于无需多线程交互,实现轻易,而且效率比较高。但是,其局限性也比较明显,即无法从多处理器硬件收益,所以此收集适合单处理器机器。当然,此收集器也可以用在小数据量(100M左右)情况下的多处理器机器上。串行垃圾收集器在一定的硬件和操作系统的配置时会缺省使用,也可以显式地用 -XX:+UseSerialGC 参数来指定。

 

     并行收集器:

         并行收集器使用多线程处理垃圾回收工作,因而速度快,效率高。而且理论上CPU数目越多,越能体现出并行收集器的优势。并行收集器在一定的硬件和操作系统配置下被缺省使用,同时,也可以使用 -XX:+UseParallelGC 参数来强制指定,线程数的多少可以用-XX:ParallelGCThreads=<N>参数来控制。

       需要说明的是,在J2SE5.0第6更新刚引入并行收集器时,在收集Young区是多线程的,但在Old区和第一种一样,仍然采用单线程并行垃圾收集器。后来在Java SE6.0中进行了增强–可以对 Old区 进行并行收集。如果年老代不使用并发收集的话,是使用单线程进行垃圾回收,因此会制约扩展能力。使用-XX:+UseParallelOldGC打开年老代使用并发收集。

 

     并发收集器:

            串行收集器和并行收集器进行垃圾回收工作时,需要暂停整个运行环境,因此,系统在垃圾回收时会有明显的暂停,而且暂停时间会由于堆越大而越长。而并发垃圾收集器并发地进行大部分垃圾收集工作(也就是在应用运行当中进行)来尽可能减少垃圾收集带来的应用停顿。它是为哪些拥有中到大量数据的、对响应时间要求高于吞吐量要求的应用,因为最小化时延的技术会让吞吐能力付出代价。并发垃圾收集器通过 -XX:+UseConcMarkSweepGC 参数来启用。它仅用于Old区的垃圾回收,此时Young区只能选择ParNew或Serial收集器中的一个,而不能选择Parallel Scavenge, 可以使用-XX:+UseParNewGC选项来强制指定使用并行的ParNew收集器。

         并 发垃圾收集器会在垃圾收集消耗时间过多的时候抛出 OutOfMemoryError 错误:如果多于 98% 的时间被花费在了垃圾收集上,并且仅有少于 2% 的堆被回收的话,就会抛出 OutOfMemoryError。这个功能是用来防止堆太小导致程序长时间无法正常工作而的

        下面是并发收集器回收垃圾过程的示意图,可以发现在初始标记和重新标记时需要暂停整个JVM,初始标记暂停的时间比重新标记的时间短。

 

     串行,并行垃圾回收器采用的都是暂停-复制的算法,而并发垃圾回收器采用标记—清除的算法

 

典型的线上jvm参数配置1

-server       让JVM以server模式运行

-Xms4g      堆的初始内存

-Xmx4g      堆的最大内存

-Xmn2g     年轻代大小

-XX:PermSize=96m     持久代初始内存

-XX:MaxPermSize=384m     持久代最大内存

-Xss1224k -XX:+UseConcMarkSweepGC    old区使用并发收集器

-XX:+UseCMSCompactAtFullCollection        打开对年老代的压缩.可能会影响性能,但是可以消除碎片

-XX:CMSMaxAbortablePrecleanTime=5000    保证CMS GC尽快完成对象的回收,避免concurrent mode failure的现象

-XX:+CMSClassUnloadingEnabled    为了避免Perm区满引起的full gc,启用类卸载策略 

-XX:+UseCMSInitiatingOccupancyOnly       old区在使用了初始化的比例后启动cms gc

-XX:CMSInitiatingOccupancyFraction=80   old区在使用了n%的后,触发cms gc

-XX:+HeapDumpOnOutOfMemoryError      堆内存溢出后dump出内存快照

-XX:HeapDumpPath=/home/admin/logs/java.hprof  堆内存溢出后dump出内存快照的存储文件

-verbose:gc -Xloggc:/home/admin/logs/gc.log       输出gc的信息和gc的日志输出文件

-XX:+PrintGCDetails           输出gc的详细信息

-XX:+PrintGCDateStamps   输出gc的时间戳

典型的线上jvm参数配置2

-server   让JVM以server模式运行

 -Xms3072m

-Xmx3072m

-Xmn1500m

-XX:PermSize=96m

-XX:MaxPermSize=256m

-XX:ParallelGCThreads=4   配置并行收集器的线程数,此值最好配置与处理器数目相等

 -XX:+UseCompressedOops   启用压缩指针.

-Xloggc:/home/admin/logs/gc.log

 -verbose:gc

-XX:+PrintGCDetails

-XX:+PrintGCDateStamps 

 

-server参数解释

   server模式默认采用并行回收GC,强制指定并行方式-XX:UseParallelGC

 -XX:+UseCompressedOops参数解释

     Java 的64位平台的性能比32位平台慢,原因是因为其指针由32位扩展到64位,虽然寻址空间从4GB 扩大到 256 TB,但导致性能的下降,并占用了更多的内存。所以对指针进行压缩。压缩后的指针最多支持32GB 内存,并且可以获得32位 JVM 的性能

 

参考文档

1.浅析JVM内存结构和6大区域:http://developer.51cto.com/art/201303/387175.htm

2.GC策略的调优:http://www.blogjava.net/BlueDavy/archive/2009/10/09/297562.html

3.jdk5,solaris5,调试CMS回收机制时的7点总结:http://blog.csdn.net/toella/article/details/7284167

4.Parallel Scavenge收集器:http://book.51cto.com/art/201107/278917.htm

5.了解CMS(Concurrent Mark-Sweep)垃圾回收器:http://www.iteye.com/topic/1119491

6.Java SE 6 Hotspot虚拟机垃圾回收调优:http://developer.51cto.com/art/201208/351690.htm

 

  • 大小: 82.8 KB
  • 大小: 21.8 KB
分享到:
评论

相关推荐

    很入理解JVM体系

    2.2、JVM体系结构 1、类加载器 2、执行引擎 3、运行时数据区 4、本地库接口 2.3、JVM内存参数调整及监控 1、JVM之内存调整 2、JVM监控工具之Jconsole 3、JVM监控工具之JProfile 加群:113035529 共同交流学习

    java-jvm虚拟机原理.ppt

    详细介绍了jvm生命周期和体系结构及垃圾回收机制

    简单介绍Java垃圾回收机制

    主要介绍了简单介绍Java垃圾回收机制,涉及一些相关的Java术语,Hotspot虚拟机,jvm体系结构等内容,具有一定借鉴价值,需要的朋友可以参考下。

    深入理解JVM内存结构及运行原理全套视频加资料.txt

     第37讲 垃圾回收算法-标记整理算法和分代收集算法 00:05:24  第38讲 垃圾收集器-serial收集器详解 00:09:45  第39讲 垃圾收集器-parnew收集器详解 00:04:53  第40讲 垃圾收集器-parallel收集器详解 00:11:...

    免费超全面的Java基础类型,容器,并发,IO流,面向对象,Web编程等代码总结

    JVM执行引擎和垃圾回收 基础语法 理解Java中对象基础Object类 基本数据类型,核心点整理 特殊的String类,以及相关扩展API 日期与时间API详解 流程控制语句,和算法应用 函数式编程概念和应用 集合容器 基于分析...

    深入理解Java虚拟机视频教程(jvm性能调优+内存模型+虚拟机原理)视频教程

    第37节垃圾回收算法-标记整理算法和分代收集算法00:05:24分钟 | 第38节垃圾收集器-serial收集器详解00:09:45分钟 | 第39节垃圾收集器-parnew收集器详解00:04:53分钟 | 第40节垃圾收集器-parallel收集器详解00:11:...

    JavaSE基础面试题.docx

    7.垃圾回收器的优点和原理,并考虑2中回收机制 8.加速垃圾回收的方式 9.JVM生命周期及体系结构 10.JVM如何调优 11.Java中的内存模型 12.JVM如何调整内存大小 13.如何实现Java优化 14.各个集合在项目中的应用场景 15....

    JAVA中级书籍

    1、对于Java基础技术体系(包括JVM、类装载机制、多线程并发、IO、网络)有一定的掌握和应用经验。 掌握JVM内存分配、JVM垃圾回收;类装载机制; 性能优化; 反射机制;多线程;IO/NIO; 网络编程;常用数据结构和...

    深入理解_Java_虚拟机 JVM_高级特性与最佳实践

    112 5.2.5 服务器JVM进程崩溃 / 113 5.3 实战:Eclipse运行速度调优 / 114 5.3.1 调优前的程序运行状态 / 114 5.3.2 升级JDK 1.6的性能变化及兼容问题 / 117 5.3.3 编译时间和类加载时间的优化 / 122 5.3.4 ...

    java虚拟机精讲(电子工业出版社出版)

    第1 章 Java体系结构 / 1 第2 章 字节码的编译原理 / 37 第3 章 字节码文件 / 67 第4 章 剖析HotSpot 的Launcher / 97 第5 章 剖析HotSpot 的初始化过程 / 122 第6 章 内存分配与垃圾回收 / 147 第7 章 类加载...

    java8源码-akangaroo:学习笔记,完善中

    GC(垃圾回收算法) JVM性能监控和故障定位 JVM调优 JavaWeb servlet request response cookie && session 基础框架 SpringMVC Mybatis SpringBoot自动配置原理 安全框架 数据库 项目管理 Maven 其它 分布式

    涵盖了90%以上的面试题

    计算机网络体系结构 谈谈你对Struts的理解。 谈谈你对Hibernate的理解。 谈谈你对Lucene和solr的理解 谈谈你对ActiveMQ的理解 Spring的IOC,DI和AOP 谈谈你对webservice和dubbo的理解 谈谈你的SOA的理解。 谈谈你对...

    Java虚拟机内存优化实践

    众所周知,Java是从C++的基础上发展而来的,而C++程序的很大的一个问题是内存泄露难以解决,尽管Java的JVM有一套自己的垃圾回收机制来回收内存,在许多情况下并不需要java程序开发人员操太多的心,但也是存在泄露...

    monitor-java-gc-on-aws-lambda

    要检查Java虚拟机(JVM)内存,您需要功能中的垃圾回收日志。 与运行时间较长的Java应用程序服务器相比,AWS Lambda函数的实例的生命周期较短。 处理来自数十个或数百个这些实例的日志可能具有挑战性。 使用此解决...

    java面试题

    63.2. 几种垃圾回收机制 43 63.2.1. 标记-清除收集器 43 63.2.2. 标记-压缩收集器 43 63.2.3. 复制收集器 44 63.2.4. 增量收集器 44 63.2.5. 分代收集器 44 63.2.6. 并发收集器 44 63.2.7. 并行收集器 44 63.3. ...

    Java虚拟机

    第一部分从宏观的角度介绍了整个Java技术体系、Java和JVM的发展历程、模块化,以及JDK的编译,这对理解本书后面内容有重要帮助。第二部分讲解了JVM的自动内存管理,包括虚拟机内存区域的划分原理以及各种内存溢出...

    疯狂JAVA讲义

    1.7 垃圾回收机制 20 1.8 何时开始使用IDE工具 21 学生提问:老师,我想学习Java编程,到底是学习Eclipse好呢,还是学习JBuilder好呢? 21 1.9 本章小结 22 本章练习 22 第2章 理解面向对象 23 2.1 面向对象 ...

    JAVA基础课程讲义

    垃圾回收机制(Garbage Collection) 63 方法的重载(overload),构造方法的重载 63 this关键字 65 static 关键字 66 静态初始化块(经常用来初始化类,加载类信息时执行!) 67 package 68 JDK中的主要包 68 import 68...

    AIC的Java课程1-6章

     [*]了解Java内存机制:栈、堆、常量池等,理解垃圾回收机制。 第3章 面向过程(数组和方法) 4课时  理解如何声明数组、构造数组、初始化数组以及使用数组中的各个元素。  清楚数组作为...

    Java经典入门教程pdf完整版

    著和管理相关的复杂问题的体系结构。JE技术的基础就是核心Java平台或Java平台的标 准版,JEE不仅巩固了标淮版屮的诈多优点,例如“编写一次、随处运行”的特性、方便存 取数据库的 JDBC API、 CORBA技术以及能够在 ...

Global site tag (gtag.js) - Google Analytics