Java8的默认GC参数

查看默认参数

cmd命令行查看Java8的GC:

java -XX:+PrintCommandLineFlags -version

结果如下:

-XX:InitialHeapSize=132397312 // JVM默认初始化堆大小
-XX:MaxHeapSize=2118356992 //JVM堆的默认最大值
-XX:+PrintCommandLineFlags 
-XX:+UseCompressedClassPointers 
-XX:+UseCompressedOops 
-XX:-UseLargePagesIndividualAllocation 
-XX:+UseParallelGC //Java8使用的GC类型
java version "1.8.0_20" //使用的java版本
Java(TM) SE Runtime Environment (build 1.8.0_20-b26)
Java HotSpot(TM) 64-Bit Server VM (build 25.20-b23, mixed mode)

结果分析:由结果可以看出Java8的GC情况是:-XX:+UseParallelGC,即Parallel Scavenge(新生代) + Parallel Old(老生代),实际上几个主流Java版本的GC情况如下:

jdk1.7 默认垃圾收集器Parallel Scavenge(新生代【标记-复制算法】)+Parallel Old(老年代【标记整理算法】) jdk1.8 默认垃圾收集器Parallel Scavenge(新生代)+Parallel Old(老年代) jdk1.9 默认垃圾收集器G1【从局部(两个Region之间)来看是基于"标记—复制"算法实现,从整体来看是基于"标记-整理"算法实现】

  1. CMD命令行查看Java8的GC详细情况:

java -XX:+PrintGCDetails -version

结果如下:

java version "1.8.0_20"
Java(TM) SE Runtime Environment (build 1.8.0_20-b26)
Java HotSpot(TM) 64-Bit Server VM (build 25.20-b23, mixed mode)
Heap
 PSYoungGen      total 38400K, used 2678K [0x00000000d5e00000, 0x00000000d8880000, 0x0000000100000000)
  eden space 33280K, 8% used [0x00000000d5e00000,0x00000000d609dbc0,0x00000000d7e80000)
  from space 5120K, 0% used [0x00000000d8380000,0x00000000d8380000,0x00000000d8880000)
  to   space 5120K, 0% used [0x00000000d7e80000,0x00000000d7e80000,0x00000000d8380000)
 ParOldGen       total 87552K, used 0K [0x0000000081a00000, 0x0000000086f80000, 0x00000000d5e00000)
  object space 87552K, 0% used [0x0000000081a00000,0x0000000081a00000,0x0000000086f80000)
 Metaspace       used 2257K, capacity 4480K, committed 4480K, reserved 1056768K
  class space    used 244K, capacity 384K, committed 384K, reserved 1048576K

在Java中使用Metaspace(元空间)而移除了PermGenspace(永久区)。也就意味着这部分内存空间将全部移除。设置JVM的参数PermSize和MaxPermSize时会被忽略并给出警告。但是类的元数据信息(metadata)还在,只是不再存储在连续的堆空间中,而是移动到了被称为"Metaspace(元空间)"的本地内存(Native memory)中。

Minor GC和Full GC

  1. Full GC定义是相对明确的,就是针对整个新生代、老生代、元空间(metaspace,java8以上版本取代perm gen)的全局范围的GC;

  2. Minor GC和Major GC是俗称,在Hotspot JVM实现的Serial GC, Parallel GC, CMS, G1 GC中大致可以对应到某个Young GC和Old GC算法组合;

  3. 最重要是搞明白上述Hotspot JVM实现中几种GC算法组合到底包含了什么。

     Serial GC算法:Serial Young GC + Serial Old GC (敲黑板!敲黑板!敲黑板!实际上它是全局范围的Full GC);

     Parallel GC算法:Parallel Young GC + 非并行的PS MarkSweep GC / 并行的Parallel Old GC(这俩实际上也是全局范围的Full GC),选PS MarkSweep GC 还是 Parallel Old GC 由参数UseParallelOldGC来控制;

     CMS算法:ParNew(Young)GC + CMS(Old)GC (piggyback on ParNew的结果/老生代存活下来的object只做记录,不做compaction)+ Full GC for CMS算法(应对核心的CMS GC某些时候的不赶趟,开销很大);

     G1 GC:Young GC + mixed GC(新生代,再加上部分老生代)+ Full GC for G1 GC算法(应对G1 GC算法某些时候的不赶趟,开销很大);

  4. 搞清楚了上面这些组合,我们再来看看各类GC算法的触发条件。简单说,触发条件就是某GC算法对应区域满了,或是预测快满了。比如,

     各种Young GC的触发原因都是eden区满了;

     Serial Old GC/PS MarkSweep GC/Parallel Old GC的触发则是在要执行Young GC时候预测其promote的object的总size超过老生代剩余size;

     CMS GC的initial marking的触发条件是老生代使用比率超过某值;

     G1 GC的initial marking的触发条件是Heap使用比率超过某值,跟4.3 heuristics 类似;

     Full GC for CMS算法和Full GC for G1 GC算法的触发原因很明显,就是4.3 和 4.4 的fancy算法不赶趟了,只能全局范围大搞一次GC了;

5 一般说的 “Full GC会先触发一次Minor GC” - 指的应该是

 PS MarkSweep GC/Parallel Old GC(Full GC)之前会跑一次Parallel Young GC;原因就是减轻Full GC 的负担。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Java8中的JVM参数有很多种,这里列出一些常用的: - -server: 指定JVM运行在服务器模式,在服务器环境下性能会更好 - -Xmx: 设置JVM最大可用内存 - -Xms: 设置JVM初始内存 - -XX:PermSize: 设置持久代(Perm Gen)的初始空间大小 - -XX:MaxPermSize: 设置持久代(Perm Gen)的最大空间大小 - -XX:NewSize: 设置新生代(Young Generation)的初始空间大小 - -XX:MaxNewSize: 设置新生代(Young Generation)的最大空间大小 还有很多其他的JVM参数,如果需要了解更多,可以查看Java官方文档或者网上的资料. ### 回答2: Java 8引入了一些新的JVM参数,以下是其中一些常用的参数: 1. -XX:MaxHeapSize:指定Java堆的最大大小。可以使用数值后缀(例如G、M)来表示大小。例如,-XX:MaxHeapSize=2G表示最大堆大小为2GB。 2. -XX:InitialHeapSize:指定Java堆的初始大小。同样可以使用数值后缀来表示大小。 3. -XX:PermSize和-XX:MaxPermSize:用于指定永久代的初始大小和最大大小。在Java 8中,永久代被元数据空间(Metaspace)所取代,所以这两个参数Java 8中已经失效。 4. -Xms和-Xmx:分别指定Java堆的初始大小和最大大小,相当于-XX:InitialHeapSize和-XX:MaxHeapSize的简写形式。 5. -Xss:指定每个线程的栈大小。默认值在不同平台上可能有所不同。 6. -XX:+UseParallelGC:启用并行垃圾收集器。在Java 8中,G1垃圾收集器已成为默认的垃圾收集器,所以这个参数在大多数情况下已不再使用。 7. -XX:+AggressiveOpts:启用一些针对特定体系结构的性能优化选项。 8. -XX:+UseConcMarkSweepGC:启用并发标记-清除垃圾收集器。这是Java 8中常用的垃圾收集器之一。 请注意,这只是一小部分Java 8中的JVM参数,还有很多其他参数可以根据特定需求进行配置。了解更多参数以及其作用可以参考官方文档或其他相关资源。 ### 回答3: Java 8引入了一些新的JVM参数,用于调优和提升性能。以下是一些常见的Java 8的JVM参数: 1. -XX:+UseG1GC:这个参数启用了G1垃圾收集器。G1是在Java 8中引入的一种全新的垃圾收集器,它通过将堆分成多个区域进行垃圾回收,以提供更稳定的垃圾收集性能。 2. -XX:+UseConcMarkSweepGC:此参数启用了CMS垃圾收集器。CMS垃圾收集器在Java 8之前就存在,但在Java 8中仍然可以使用。它是一种并发标记清除垃圾收集器,可用于减少垃圾收集停顿时间。 3. -XX:MaxGCPauseMillis:此参数用于设置期望的最大垃圾收集停顿时间(以毫秒为单位)。可以根据具体需求调整该值,以平衡垃圾收集的性能和停顿时间。 4. -XX:MetaspaceSize和-XX:MaxMetaspaceSize:这些参数用于设置元空间的初始大小和最大大小。元空间是在Java 8中引入的一种用于存储类元数据的新空间,取代了永久代,因此在Java 8中不再使用-XX:PermSize和-XX:MaxPermSize参数。 5. -XX:+UseStringDeduplication:此参数用于启用字符串去重。它可以降低内存消耗,避免相同字符串的重复存储。 6. -XX:ParallelGCThreads和-XX:ConcGCThreads:这些参数用于设置并行垃圾收集器和并发垃圾收集器的线程数。可以根据计算机的硬件资源和应用程序的需求来调整这些参数,以达到最佳性能。 总之,Java 8引入了一些新的JVM参数,可以根据应用程序的需求来调整这些参数,以获得更好的性能和吞吐量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值