写在前面
随之API基于jdk7,cms的调参之旅结束,我们下一阶段准备将历史遗留系统由jdk7升级到jdk8,jdk8存在一些非常好的特性,当然函数式编程并不是我们最想要的,最想要的还是他的异步响应编程模型的支持。
在Java web编程生态领域,想要实现响应式编程方式还是比较多的,jdk7之前rxjava这种方案比较普遍,但是个人认为学习成本较高。同时其出现背景是因为jdk7以前没得选。
而jdk8之后,其本身在支持响应式编程方案已经有了jdk角度的支持,所以rxjava这种库,框架方式的支持就没有继续深入的必要了。
java web开发整个生态里不可或缺的是spring框架,在spring boot的web flux已经对响应式编程进行了,当然特性还是需要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.