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
相关推荐
2.2、JVM体系结构 1、类加载器 2、执行引擎 3、运行时数据区 4、本地库接口 2.3、JVM内存参数调整及监控 1、JVM之内存调整 2、JVM监控工具之Jconsole 3、JVM监控工具之JProfile 加群:113035529 共同交流学习
**小菜鸟系列-JVM体系结构** Java虚拟机(JVM)是Java平台的核心组成部分,它为Java程序提供了跨平台的运行环境。理解JVM的体系结构对于优化代码性能、排查故障以及深入理解Java编程至关重要。在本文中,我们将探讨...
**JVM体系结构与GC调优** Java虚拟机(JVM)是Java应用程序的核心组成部分,它为Java程序提供了跨平台的运行环境。了解JVM的体系结构和垃圾收集(Garbage Collection, GC)机制对于优化Java应用性能至关重要。 **1...
通过深入理解JVM的运行时数据区域、垃圾回收机制和类加载机制,开发者能够更好地优化Java应用程序的性能,避免常见的内存泄漏问题,并充分利用JVM的强大功能。这些核心概念不仅对于日常开发至关重要,也是深入学习...
JVM体系架构 JVM 体系架构是 JavaVirtual Machine(Java虚拟机)的核心组件之一,它主要负责管理 Java 程序的内存模型。本文将详细介绍 JVM 体系架构的组件、内存模型、运行时数据区、垃圾收集机制等关键知识点。 ...
Java垃圾回收机制是Java语言中一个重要的组件,它负责自动管理Java程序中的内存分配和回收。Java开发者不需要自己编写代码实现垃圾回收,这使得Java语言更加易于使用和维护。 Java关键术语 ---------------- 在...
综上所述,JVM体系结构是Java语言跨平台运行的核心。了解JVM的工作机制有助于开发出更加健壮和高效的Java程序。JVM类加载机制、内存管理、执行引擎等知识点,对于性能调优和故障排除也至关重要。通过掌握这些知识点...
Java的垃圾收集机制自动管理堆内存,通过不同类型的垃圾收集器来实现内存回收,如串行、并行、并发和G1垃圾收集器。 1.3 Java虚拟机的特性 JVM的一个重要特性是它的即时编译器(JIT),它能够在运行时将频繁执行的...
JVM的垃圾回收机制是为了自动释放不再被引用的对象所占用的内存,它涉及多个回收算法和策略。垃圾回收器会周期性地检查堆中的对象,标识出不再使用的对象,并回收其占用的空间。新生代和旧生代的堆结构设计是垃圾...
**垃圾回收机制**是JVM内存管理的重要组成部分,它自动地回收不再使用的对象占用的内存。JVM提供了多种垃圾收集器,如Serial、Parallel、CMS、G1等,针对不同代的内存使用不同的算法,例如新生代常用的复制算法,老...
在本文中,我们将深入探讨Java虚拟机的体系结构、垃圾回收机制、Java对象的生命周期和分代,以及相关的参数设置与调优。 Java虚拟机体系结构 Java虚拟机由三个主要组件组成:类加载器、运行时数据区和执行引擎。类...
Java 语言提供了自动垃圾回收机制,C++ 语言需要程序员自己来分配和回收内存。Java 语言更加容易上手,C++ 语言更加灵活和高效。 什么人需要学 JVM?拥有一定开发经验的 Java 开发人员、软件设计师、架构师和虚拟机...
JVM体系结构是指虚拟机的内部构造,包括类加载器(Class Loader)、运行时数据区(Runtime Data Areas)、执行引擎(Execution Engine)、本地接口(Native Interface)和垃圾回收器(Garbage Collector)等组成部分...
手册前言部分强调了对JVM体系结构的深入理解是性能调优的前提。在这个基础上,通过实例(example)的实践来巩固和验证理论知识。生产环境的复杂性要求开发者必须具备高度的实践能力,本手册可以作为学习和参考资料。...
JVM 的垃圾回收机制可以自动回收无用的对象,释放内存资源。JVM 的垃圾回收算法有很多,如 Mark-Sweep 算法和 Concurrent Mark-Sweep 算法等。 9. JVM 的沙箱机制 JVM 的沙箱机制是一种安全机制,用于限制 Java ...
同时,JVM的内存管理(包括新生代、老年代、Eden和Survivor空间)和垃圾回收机制(如 Minor GC 和 Major GC)也是开发者关注的重点,因为它们直接影响到应用的响应速度和稳定性。 此外,JVM的动态类加载和热部署...
本篇文章将深入探讨JVM的生命周期、体系结构、类加载机制、内存区域以及垃圾收集。 首先,JVM的生命周期与Java程序紧密关联。每当运行一个Java程序时,就会创建一个JVM实例。这个实例在程序执行期间存在,直到程序...
通过对JVM_GC调优的深入探讨,我们可以看出JVM内存管理和垃圾回收机制的复杂性。合理的GC策略和参数调整对于提高Java应用的性能至关重要。理解不同GC算法的特点和适用场景,可以帮助开发者选择最适合特定应用场景的...