- 浏览: 100494 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
鸟气凌人:
最经正在看基础
Oracle PL/SQL中游标和游标变量的使用 -
matraxa:
讲得很清楚,顶一个!
JVM垃圾回收机制总结(1) —基本概念 -
ZavaKid:
顶楼主,通俗易懂。
byw,上面的图用什么软件画的?
JVM垃圾回收机制总结(1) —基本概念 -
47478220:
对这里还不太了解,学习了。
Java 虚拟机体系结构
以下配置主要针对分代垃圾回收算法而言。
堆大小设置
年轻代的设置很关键
JVM中最大堆大小有三方面限制:相关操作系统的数据模型(32-bt还是64-bit)限制;系统的可用虚拟内存限制;系统的可用物理内存限制。32位系统下,一般限制在1.5G~2G;64为操作系统对内存无限制。在Windows Server 2003 系统,3.5G物理内存,JDK5.0下测试,最大可设置为1478m。
典型设置:
java -Xmx3550m -Xms3550m -Xmn2g –Xss128k
-Xmx3550m: 设置JVM最大可用内存为3550M。
-Xms3550m: 设置JVM促使内存为3550m。此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。
-Xmn2g: 设置年轻代大小为2G。整个堆大小=年轻代大小 + 年老代大小 + 持久代大小。持久代一般固定大小为64m,所以增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。
-Xss128k: 设置每个线程的堆栈大小。JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为 256K。更具应用的线程所需内存大小进行调整。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。
java -Xmx3550m -Xms3550m -Xss128k -XX:NewRatio=4 -XX:SurvivorRatio=4 -XX:MaxPermSize=16m -XX:MaxTenuringThreshold=0
-XX:NewRatio=4 :设置年轻代(包括Eden和两个Survivor区)与年老代的比值(除去持久代)。设置为4,则年轻代与年老代所占比值为1:4,年轻代占整个堆栈的1/5
-XX:SurvivorRatio=4 :设置年轻代中Eden区与Survivor区的大小比值。设置为4,则两个Survivor区与一个Eden区的比值为2:4,一个Survivor区占整个年轻代的1/6
-XX:MaxPermSize=16m: 设置持久代大小为16m。
-XX:MaxTenuringThreshold=0: 设置垃圾最大年龄。如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代。对于年老代比较多的应用,可以提高效率。如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概论。
回收器选择
JVM给了三种选择:串行收集器、并行收集器、并发收集器 ,但是串行收集器只适用于小数据量的情况,所以这里的选择主要针对并行收集器和并发收集器。默认情况下,JDK5.0以前都是使用串行收集器,如果想使用其他收集器需要在启动时加入相应参数。JDK5.0以后,JVM会根据当前系统配置 进行判断。
吞吐量优先的并行收集器
如上文所述,并行收集器主要以到达一定的吞吐量为目标,适用于科学技术和后台处理等。
典型配置:
java -Xmx3800m -Xms3800m -Xmn2g -Xss128k -XX:+UseParallelGC -XX:ParallelGCThreads=20
-XX:+UseParallelGC: 选择垃圾收集器为并行收集器。此配置仅对年轻代有效。即上述配置下,年轻代使用并发收集,而年老代仍旧使用串行收集。
-XX:ParallelGCThreads=20: 配置并行收集器的线程数,即:同时多少个线程一起进行垃圾回收。此值最好配置与处理器数目相等。
java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseParallelGC -XX:ParallelGCThreads=20 -XX:+UseParallelOldGC
-XX:+UseParallelOldGC: 配置年老代垃圾收集方式为并行收集。JDK6.0支持对年老代并行收集。
java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseParallelGC -XX:MaxGCPauseMillis=100
-XX:MaxGCPauseMillis=100 :设置每次年轻代垃圾回收的最长时间,如果无法满足此时间,JVM会自动调整年轻代大小,以满足此值。
n java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseParallelGC -XX:MaxGCPauseMillis=100 -XX:+UseAdaptiveSizePolicy
-XX:+UseAdaptiveSizePolicy :设置此选项后,并行收集器会自动选择年轻代区大小和相应的Survivor区比例,以达到目标系统规定的最低相应时间或者收集频率等,此值建议使用并行收集器时,一直打开。
响应时间优先的并发收集器
如上文所述,并发收集器主要是保证系统的响应时间,减少垃圾收集时的停顿时间。适用于应用服务器、电信领域等。
典型配置:
java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:ParallelGCThreads=20 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC
-XX:+UseConcMarkSweepGC: 设置年老代为并发收集。测试中配置这个以后,-XX:NewRatio=4的配置失效了,原因不明。所以,此时年轻代大小最好用-Xmn设置。
-XX:+UseParNewGC: 设置年轻代为并行收集。可与CMS收集同时使用。JDK5.0以上,JVM会根据系统配置自行设置,所以无需再设置此值。
java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseConcMarkSweepGC -XX:CMSFullGCsBeforeCompaction=5 -XX:+UseCMSCompactAtFullCollection
-XX:CMSFullGCsBeforeCompaction: 由于并发收集器不对内存空间进行压缩、整理,所以运行一段时间以后会产生“碎片”,使得运行效率降低。此值设置运行多少次GC以后对内存空间进行压缩、整理。
-XX:+UseCMSCompactAtFullCollection: 打开对年老代的压缩。可能会影响性能,但是可以消除碎片
辅助信息
JVM提供了大量命令行参数,打印信息,供调试使用。主要有以下一些:
-XX:+PrintGC: 输出形式:[GC 118250K->113543K(130112K), 0.0094143 secs] [Full GC 121376K->10414K(130112K), 0.0650971 secs]
-XX:+PrintGCDetails: 输出形式:[GC [DefNew: 8614K->781K(9088K), 0.0123035 secs] 118250K->113543K(130112K), 0.0124633 secs] [GC [DefNew: 8614K->8614K(9088K), 0.0000665 secs][Tenured: 112761K->10414K(121024K), 0.0433488 secs] 121376K->10414K(130112K), 0.0436268 secs]
-XX:+PrintGCTimeStamps -XX:+PrintGC: PrintGCTimeStamps可与上面两个混合使用
输出形式:11.851: [GC 98328K->93620K(130112K), 0.0082960 secs]
-XX:+PrintGCApplicationConcurrentTime: 打印每次垃圾回收前,程序未中断的执行时间。可与上面混合使用。输出形式:Application time: 0.5291524 seconds
-XX:+PrintGCApplicationStoppedTime: 打印垃圾回收期间程序暂停的时间。可与上面混合使用。输出形式:Total time for which application threads were stopped: 0.0468229 seconds
-XX:PrintHeapAtGC: 打印GC前后的详细堆栈信息。输出形式:
34.702: [GC {Heap before gc invocations=7:
def new generation total 55296K, used 52568K [0x1ebd0000, 0x227d0000, 0x227d0000)
eden space 49152K, 99% used [0x1ebd0000, 0x21bce430, 0x21bd0000)
from space 6144K, 55% used [0x221d0000, 0x22527e10, 0x227d0000)
to space 6144K, 0% used [0x21bd0000, 0x21bd0000, 0x221d0000)
tenured generation total 69632K, used 2696K [0x227d0000, 0x26bd0000, 0x26bd0000)
the space 69632K, 3% used [0x227d0000, 0x22a720f8, 0x22a72200, 0x26bd0000)
compacting perm gen total 8192K, used 2898K [0x26bd0000, 0x273d0000, 0x2abd0000)
the space 8192K, 35% used [0x26bd0000, 0x26ea4ba8, 0x26ea4c00, 0x273d0000)
ro space 8192K, 66% used [0x2abd0000, 0x2b12bcc0, 0x2b12be00, 0x2b3d0000)
rw space 12288K, 46% used [0x2b3d0000, 0x2b972060, 0x2b972200, 0x2bfd0000)
34.735: [DefNew: 52568K->3433K(55296K), 0.0072126 secs] 55264K->6615K(124928K)Heap after gc invocations=8:
def new generation total 55296K, used 3433K [0x1ebd0000, 0x227d0000, 0x227d0000)
eden space 49152K, 0% used [0x1ebd0000, 0x1ebd0000, 0x21bd0000)
from space 6144K, 55% used [0x21bd0000, 0x21f2a5e8, 0x221d0000)
to space 6144K, 0% used [0x221d0000, 0x221d0000, 0x227d0000)
tenured generation total 69632K, used 3182K [0x227d0000, 0x26bd0000, 0x26bd0000)
the space 69632K, 4% used [0x227d0000, 0x22aeb958, 0x22aeba00, 0x26bd0000)
compacting perm gen total 8192K, used 2898K [0x26bd0000, 0x273d0000, 0x2abd0000)
the space 8192K, 35% used [0x26bd0000, 0x26ea4ba8, 0x26ea4c00, 0x273d0000)
ro space 8192K, 66% used [0x2abd0000, 0x2b12bcc0, 0x2b12be00, 0x2b3d0000)
rw space 12288K, 46% used [0x2b3d0000, 0x2b972060, 0x2b972200, 0x2bfd0000)
}
, 0.0757599 secs]
-Xloggc:filename: 与上面几个配合使用,把相关日志信息记录到文件以便分析。
常见配置汇总
堆设置
-Xms: 初始堆大小
-Xmx: 最大堆大小
-XX:NewSize=n: 设置年轻代大小
-XX:NewRatio=n: 设置年轻代和年老代的比值。如:为3,表示年轻代与年老代比值为1:3,年轻代占整个年轻代年老代和的1/4
-XX:SurvivorRatio=n: 年轻代中Eden区与两个Survivor区的比值。注意Survivor区有两个。如:3,表示Eden:Survivor=3:2,一个Survivor区占整个年轻代的1/5
-XX:MaxPermSize=n: 设置持久代大小
收集器设置
-XX:+UseSerialGC: 设置串行收集器
-XX:+UseParallelGC: 设置并行收集器
-XX:+UseParalledlOldGC: 设置并行年老代收集器
-XX:+UseConcMarkSweepGC: 设置并发收集器
垃圾回收统计信息
-XX:+PrintGC
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-Xloggc:filename
并行收集器设置
-XX:ParallelGCThreads=n :设置并行收集器收集时使用的CPU数。并行收集线程数。
-XX:MaxGCPauseMillis=n :设置并行收集最大暂停时间
-XX:GCTimeRatio=n :设置垃圾回收时间占程序运行时间的百分比。公式为1/(1+n)
并发收集器设置
-XX:+CMSIncrementalMode: 设置为增量模式。适用于单CPU情况。
-XX:ParallelGCThreads=n: 设置并发收集器年轻代收集方式为并行收集时,使用的CPU数。并行收集线程数。
调优总结
年轻代大小选择
响应时间优先的应用: 尽可能设大,直到接近系统的最低响应时间限制(根据实际情况选择)。 在此种情况下,年轻代收集发生的频率也是最小的。同时,减少到达年老代的对象。
吞吐量优先的应用: 尽可能的设置大,可能到达Gbit的程度。因为对响应时间没有要求,垃圾收集可以并行进行,一般适合8CPU以上的应用。
年老代大小选择
响应时间优先的应用: 年老代使用并发收集器,所以其大小需要小心设置,一般要考虑并发会话率 和会话持续时间 等一些参数。如果堆设置小了,可以会造成内存碎片、高回收频率以及应用暂停而使用传统的标记清除方式;如果堆大了,则需要较长的收集时间。最优化的方案,一般需要参考以下数据获得:
1. 并发垃圾收集信息
2. 持久代并发收集次数
3. 传统GC信息
4. 花在年轻代和年老代回收上的时间比例
减少年轻代和年老代花费的时间,一般会提高应用的效率
吞吐量优先的应用
一般吞吐量优先的应用都有一个很大的年轻代和一个较小的年老代。原因是,这样可以尽可能回收掉大部分短期对象,减少中期的对象,而年老代尽存放长期存活对象。
较小堆引起的碎片问题
因为年老代的并发收集器使用标记、清除算法,所以不会对堆进行压缩。当收集器回收时,他会把相邻的空间进行合并,这样可以分配给较大的对象。但是,当堆空间较小时,运行一段时间以后,就会出现“碎片”,如果并发收集器找不到足够的空间,那么并发收集器将会停止,然后使用传统的标记、清除方式进行回收。如果出现“碎片”,可能需要进行如下配置:
1. -XX:+UseCMSCompactAtFullCollection: 使用并发收集器时,开启对年老代的压缩。
2. -XX:CMSFullGCsBeforeCompaction=0: 上面配置开启的情况下,这里设置多少次Full GC后,对年老代进行压缩。
发表评论
-
J2SE 四大技术体系
2011-01-31 14:51 1053讲到Java,很容易就想 ... -
Java 虚拟机体系结构
2011-01-31 14:50 906众所周知,Java源代码被编译器编译成class文件。而并不是 ... -
Class文件内容及常量池
2011-01-31 14:49 809当JVM运行Java程序的时候 ... -
JVM垃圾回收机制总结(1) —基本概念
2011-01-31 14:48 1343数据类型 Java虚 ... -
JVM垃圾回收机制总结(2) —基本算法概述
2011-01-31 14:47 10121、引用计数收集器 (Reference Counting) ... -
JVM垃圾回收机制总结(3) —按代垃圾收集器
2011-01-31 14:47 961为什么要分代 ... -
JVM垃圾回收机制总结(4) —新一代的垃圾回收算法
2011-01-31 14:45 858垃圾回收的瓶颈 ... -
JVM垃圾回收机制总结(6)—透视Java的GC特性
2011-01-31 14:44 10081、 使用 System.gc() 可以 ... -
JVM垃圾回收机制总结(7) —调优方法
2011-01-31 14:43 979JVM调优工具 Jconsole,j ... -
JVM垃圾回收机制总结(8)—反思和参考资料
2011-01-31 14:41 1165垃圾回收的悖论 所谓“成也萧何败萧何”。Java的 ... -
JVM加载class文件的原理
2011-01-31 14:39 802当Java编译器编译 ... -
Java内存泄露问题
2011-01-31 14:37 1256内存泄露 所谓内存泄露就是指一个不再被 ...
相关推荐
* 垃圾收集(GC):是JVM中自动管理内存的机制,用于回收无用的对象。 * 垃圾收集算法:有串行回收器、并行回收器、并发标记清除回收器等多种算法。 * 垃圾收集统计:可以使用jstat命令来查看垃圾收集情况。 实际...
6. **更好的垃圾回收**:JDK 7改进了垃圾回收机制,尤其是G1(Garbage-First)垃圾收集器,提升了内存管理的效率。 **安装与环境配置** 压缩包内的“配置环境.txt”文件应该包含了关于如何在Windows 32位系统上...
在JDK 7中,垃圾回收机制得到了显著的优化。特别是对G1(Garbage First)收集器进行了增强,使得它在多核处理器上表现更佳,减少了应用程序的暂停时间,提高了吞吐量。 ##### 2.2 文件系统API增强 为了更好地支持...
3. **改进的垃圾回收机制**:G1垃圾收集器的引入,这是一种低延迟的垃圾收集器,特别适合于具有大量内存的应用程序。 4. **新的NIO.2 API**:增强了文件I/O操作的能力,支持文件观察者模式,简化了文件系统的访问。 ...
服务器和分布式系统方面,JDK8提供了许多对高并发和分布式环境的支持,如并发工具类库、改进的垃圾回收机制等。例如,G1(Garbage First)垃圾收集器在大型分布式系统中表现出色,它能够平衡暂停时间和空间效率。 ...
5. **改进的垃圾收集器(G1和ZGC)**:优化了垃圾回收机制,提高了应用的响应时间和吞吐量。 三、JDK 11.0.16.1的更新与优化 JDK 11.0.16.1是一个更新版本,主要修复了一些已知的安全漏洞,提高了系统的安全性。...
2. **改进的内存管理**:引入了G1垃圾收集器,这是一种新的垃圾回收机制,可以更有效地管理内存,减少停顿时间。 3. **NIO.2**:引入了新的文件系统API,提供了更好的异步I/O支持,增强了对操作系统文件系统的访问...
- JVM的垃圾回收机制(如G1垃圾收集器)在1.8版本中有显著优化。 - `-XX`选项允许开发者调整JVM参数以优化性能。 总之,JDK 1.8 64位Linux版本为开发者提供了强大的开发环境,结合Java 8的新特性以及64位系统的...
3. **垃圾回收**:在JDK 6中,垃圾收集器有所改进,提供了更好的内存管理,降低了应用暂停时间,提升了整体性能。 4. **NIO.2**:引入了新的文件系统API,即Java NIO.2,提供了异步I/O操作,增强了文件操作的灵活性...
Java 8的JVM在性能上有显著提升,包括改进的垃圾回收机制和更高效的内存管理,例如G1垃圾收集器的引入,优化了大型应用的内存分配和回收。 3. **Java类库**:JDK 8的类库扩展了许多新功能,如`java.time`包提供了更...
2. **改进的内存管理**:这个版本引入了G1(Garbage First)垃圾收集器的早期版本,这是一种并行的、适应性的垃圾回收策略,旨在减少暂停时间,提高服务器应用的响应速度。 3. **NIO.2**:JDK 1.6引入了新的非阻塞I...
这个版本的更新包括了重要的安全补丁,增强了垃圾回收机制,提升了JVM(Java虚拟机)的性能,并对Java语言的一些API进行了增强。 二、主要特性与改进 1. **Lambda表达式和函数式接口**:Java 8引入了Lambda表达式...
2. **性能优化**:Oracle团队不断对JVM(Java虚拟机)进行优化,提升运行效率,比如垃圾回收机制的改进,这直接影响到Java应用的运行速度。 3. **API增强**:JDK 8引入了大量的新API,如Lambda表达式、Stream API、...
6. **改进的垃圾回收**:JDK 1.7对垃圾收集器进行了优化,提高了性能,特别是G1垃圾收集器,它是用于服务器环境的一个全功能的垃圾收集器。 7. **动态类型语言支持**:通过JSR 223和JSR 199,Java 7支持了更多的...
9. **内存管理和性能优化**: JDK 8在内存管理方面进行了优化,例如改进的垃圾回收机制(G1垃圾收集器),以及对于大型数据集处理的性能提升。 10. **多线程编程**: Java 8提供了更好的并发库和工具,使得开发者可以...
- **性能优化**:JDK 1.8在性能方面做了很多优化,比如G1垃圾收集器的改进、Lambda表达式引入、 invokedynamic指令的应用等,这些都可以提高程序的运行效率。 - **内存管理**:理解JVM的内存模型,包括堆内存、栈...
同时,垃圾回收机制也得到了改进,比如G1垃圾收集器的引入,使得内存管理更为高效。 **使用JDK 1.8.0的步骤**: 1. 解压`jdk1.8.0.tar.gz`文件到指定目录,例如`/usr/lib/jvm`。 2. 配置环境变量,包括`JAVA_HOME`...
JVM调优通常涉及以下几个方面:内存管理、垃圾收集策略、线程管理以及类加载机制等。有效的JVM调优能够显著提升Java应用的性能表现。 #### 二、JVM常见参数 ##### 堆栈相关 - **-Xss**:调整线程栈大小。线程栈...
- **JVM改进**:包括更好的内存管理,更高效的类加载机制,以及对G1垃圾收集器的改进。 - **JavaFX集成**:JavaFX 2.2被集成到JDK中,使得开发丰富的客户端应用变得更加容易。 **注意事项** - 在安装JDK 1.7.0_71...
- **垃圾收集器的选择与配置**:不同的垃圾收集器有不同的性能特征,选择合适的垃圾收集器并进行合理配置,可以有效提升系统性能。例如,CMS(Concurrent Mark Sweep)适合低暂停时间需求,G1(Garbage-First)则...