JVM-内存管理和内存回收
来源:互联网 发布:交通大数据应用 编辑:程序博客网 时间:2024/06/08 02:12
一、堆
所有通过new创建的对象的内存都在堆中分配,其大小可以通过-Xmx和-Xms来控制。堆被划分为新生代和旧生代,新生代又被进一步划分为Eden和Survivor区,最后Survivor由From Space和To Space组成。
新建的对象都是用新生代分配内存,旧生代用于存放新生代中经过多次垃圾回收仍然存活的对象。
二、方法区
可通过-XX:PermSize和-XX:MaxPermSize来指定最小值和最大值。
垃圾回收机制
JVM分别对新生代和旧生代采用不同的垃圾回收机制。
新生代GC
在执行机制上JVM提供了串行GC(Serial GC)、并行回收GC(Parallel Scavenge)和并行GC(ParNew)
1)串行GC
在整个扫描和复制过程采用单线程的方式来进行,适用于单CPU、新生代空间较小及对暂停时间要求不是非常高的应用上,是client级别默认的GC方式,可以通过-XX:+UseSerialGC来强制指定
2)并行回收GC
在整个扫描和复制过程采用多线程的方式来进行,适用于多CPU、对暂停时间要求较短的应用上,是server级别默认采用的GC方式,可用-XX:+UseParallelGC来强制指定,用-XX:ParallelGCThreads=4来指定线程数
3)并行GC
与旧生代的并发GC配合使用
旧生代GC
旧生代与新生代不同,对象存活的时间比较长,比较稳定,因此采用标记(Mark)算法来进行回收,所谓标记就是扫描出存活的对象,然后再进行回收未被标记的对象,回收后对用空出的空间要么进行合并,要么标记出来便于下次进行分配,总之就是要减少内存碎片带来的效率损耗。在执行机制上JVM提供了串行GC(Serial MSC)、并行GC(parallel MSC)和并发GC(CMS)。GC组合
以上各种GC机制是需要组合使用的,指定方式由下表所示:
指定方式
新生代GC方式
旧生代GC方式
-XX:+UseSerialGC
串行GC
串行GC
-XX:+UseParallelGC
并行回收GC
并行GC
-XX:+UseConeMarkSweepGC
并行GC
并发GC
-XX:+UseParNewGC
并行GC
串行GC
-XX:+UseParallelOldGC
并行回收GC
并行GC
-XX:+ UseConeMarkSweepGC
-XX:+UseParNewGC
串行GC
并发GC
不支持的组合
1、-XX:+UseParNewGC -XX:+UseParallelOldGC
2、-XX:+UseParNewGC -XX:+UseSerialGC
JAVA 内存调优
对JVM内存调优的时候不能只看操作系统级别Java进程所占用的内存,这个数值不能准确的反应堆内存的真实占用情况,因为GC过后这个值是不会变化的,因此内存调优的时候要更多地使用JDK提供的内存查看工具,比如JConsole和Java VisualVM。1)新生代设置过小
一是新生代GC次数非常频繁,增大系统消耗;二是导致大对象直接进入旧生代,占据了旧生代剩余空间,诱发Full GC
2)新生代设置过大
一是新生代设置过大会导致旧生代过小(堆总量一定),从而诱发Full GC;二是新生代GC耗时大幅度增加
一般说来新生代占整个堆1/3比较合适
3)Survivor设置过小
导致对象从eden直接到达旧生代,降低了在新生代的存活时间
4)Survivor设置过大
导致eden过小,增加了GC频率
另外,通过-XX:MaxTenuringThreshold=n来控制新生代存活时间,尽量让对象在新生代被回收。1)吞吐量优先
JVM以吞吐量为指标,自行选择相应的GC策略及控制新生代与旧生代的大小比例,来达到吞吐量指标。这个值可由-XX:GCTimeRatio=n来设置
2)暂停时间优先
JVM以暂停时间为指标,自行选择相应的GC策略及控制新生代与旧生代的大小比例,尽量保证每次GC造成的应用停止时间都在指定的数值范围内完成。这个值可由-XX:MaxGCPauseRatio=n来设置
- 堆设置
- -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数。并行收集线程数。
- JVM-内存管理和内存回收
- JVM的内存管理和垃圾回收
- Sun JVM内存管理和垃圾回收
- JVM学习内存管理和垃圾回收
- JVM内存管理和垃圾回收
- JVM的内存管理和垃圾回收
- jvm内存管理和垃圾回收
- JVM内存管理和垃圾回收
- JVM内存管理和垃圾回收
- JVM的内存管理和垃圾回收
- JVM学习内存管理和垃圾回收
- JVM内存管理和垃圾回收
- JVM的内存管理和垃圾回收
- JVM(三)--JVM内存管理和JVM垃圾回收
- JVM内存管理和JVM垃圾回收机制
- JVM内存管理和JVM垃圾回收机制
- JVM内存管理和JVM垃圾回收机制
- JVM内存管理和JVM垃圾回收机制
- 重温八皇后
- 修改vmware里mac os的屏幕分辨率
- fashion clothing//
- Oracle中Integer类型/DBNull的处理方法
- 遍历目录并将目录下所有文件放到列表中-Python
- JVM-内存管理和内存回收
- ubuntu 12.04(64位)下搭建android5.0开发环境
- ACM水题系列 HDOJ 1061
- 检测Python程序执行效率及内存和CPU使用的7种方法
- Apache与tomcat简介
- 基础练习二
- Hope is a good thing, maybe the best of things and no good thing ever dies !
- Max Points on a Line
- 离散数学实验课中有趣的题目