前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >GC和垃圾回收器其六:G1调参

GC和垃圾回收器其六:G1调参

作者头像
春哥大魔王
发布2019-09-09 17:47:26
2K0
发布2019-09-09 17:47:26
举报
文章被收录于专栏:服务端技术杂谈

写在前面

随之API基于jdk7,cms的调参之旅结束,我们下一阶段准备将历史遗留系统由jdk7升级到jdk8,jdk8存在一些非常好的特性,当然函数式编程并不是我们最想要的,最想要的还是他的异步响应编程模型的支持。

在Java web编程生态领域,想要实现响应式编程方式还是比较多的,jdk7之前rxjava这种方案比较普遍,但是个人认为学习成本较高。同时其出现背景是因为jdk7以前没得选。

而jdk8之后,其本身在支持响应式编程方案已经有了jdk角度的支持,所以rxjava这种库,框架方式的支持就没有继续深入的必要了。

java web开发整个生态里不可或缺的是spring框架,在spring boot的web flux已经对响应式编程进行了,当然特性还是需要jdk8进行支持的。

综上升级jdk8迫在眉睫,才能将系统改造成响应式。

jdk8参数配置

1.由于jdk8开始,没有了永久区的概念,所以在jvm参数配置上不再需要

-XX:PermSize

-XX:MaxPermSize

的配置了

2.metaspace,元数据空间,专门用来存元数据的,它是jdk8里特有的数据结构用来替代perm

相关的参数有两个CompressedClassSpaceSize和MaxMetaspaceSize (1)CompressedClassSpaceSize参数作用是设置Klass Metaspace的大小,默认1G Klass Metaspace就是用来存klass的,klass是的class文件在jvm里的运行时数据结构,没有开启压缩指针,就不会有CompressedClassSpaceSize这块内存,但是jdk1.8里应该是默认开启的,并且,如果这块内存会如果没有满会一直增加。

但是-Xmx超过了32G,压缩指针是默认不开启的,而这个参数也就失去了设置的意义。

通过设置-XX:CompressedClassSpaceSize=128m来调节

(2)MaxMetaspaceSize

默认基本是无穷大,这个参数很可能会因为没有限制而导致metaspace被无止境使用(一般是内存泄漏)而被OS Kill。这个参数会限制metaspace(包括了Klass Metaspace以及NoKlass Metaspace)被committed的内存大小,会保证committed的内存不会超过这个值,一旦超过就会触发GC,这里要注意和MaxPermSize的区别,MaxMetaspaceSize并不会在jvm启动的时候分配一块这么大的内存出来,而MaxPermSize是会分配一块这么大的内存的。

3.MaxDirectMemorySize

此参数主要影响的是非堆内存的direct byte buffer,jvm默认会设置64M,可根据功能适当加大此项参数,因为非堆内存,故而不会被GC回收掉,容易出现java.lang.OutOfMemoryError: Direct buffer memory错误

如出现以上错误,可通过以下参数打印log,之后用工具进行分析

-XX:-HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=logs/oom_dump.log

4.G1收集器参数

-XX:+UseG1GC 使用G1收集器 -XX:MaxGCPauseMillis=200 用户设定的最大gc 停顿时间,默认是200ms. -XX:InitiatingHeapOccupancyPercent=45 默认是45,也就是heap中45%的容量被使用,则会触发concurrent gc

-XX:NewRatio=n 新生代与老生代(new/old generation)的大小比例(Ratio). 默认值为 2. -XX:SurvivorRatio=n eden/survivor 空间大小的比例(Ratio). 默认值为 8. -XX:MaxTenuringThreshold=n 提升年老代的最大临界值(tenuring threshold). 默认值为 15. -XX:ParallelGCThreads=n 设置垃圾收集器在并行阶段使用的线程数,默认值随JVM运行的平台不同而不同. -XX:ConcGCThreads=n 并发垃圾收集器使用的线程数量. 默认值随JVM运行的平台不同而不同. -XX:G1ReservePercent=n 设置堆内存保留为假天花板的总量,以降低提升失败的可能性. 默认值是 10. -XX:G1HeapRegionSize=n 使用G1时Java堆会被分为大小统一的区(region)。此参数可以指定每个heap区的大小. 默认值将根据 heap size 算出最优解. 最小值为 1Mb, 最大值为 32Mb.


本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-09-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 春哥talk 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • jdk8参数配置
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档