zoukankan      html  css  js  c++  java
  • Springboot项目优化和jvm调优

    关于GC有一个常见的疑问是,在启动时,我的内存如何分配?经过前面的介绍,已经很容易知道,用-Xmn,-Xmx,-Xms,-Xss,-XX:NewSize,-XX:MaxNewSize,-XX:MaxPermSize,-XX:PermSize,-XX:SurvivorRatio,-XX:PretenureSizeThreshold,-XX:MaxTenuringThreshold就基本可以配置内存启动时的分配情况。但是,具体配置多少?设置小了,频繁GC(甚至内存溢出),设置大了,内存浪费。结合前面对于内存区域和其作用的学习,尽量考虑如下建议

    -XX:PermSize尽量比-XX:MaxPermSize小,-XX:MaxPermSize>= 2 * -XX:PermSize, -XX:PermSize> 64m,一般对于4G内存的机器,-XX:MaxPermSize不会超过256m;

    -Xms = -Xmx(线上Server模式),以防止抖动,大小受操作系统和内存大小限制,如果是32位系统,则一般-Xms设置为1g-2g(假设有4g内存),在64位系统上,没有限制,不过一般为机器最大内存的一半左右;

    -Xmn,在开发环境下,可以用-XX:NewSize和-XX:MaxNewSize来设置新生代的大小(-XX:NewSize<=-XX:MaxNewSize),在生产环境,建议只设置-Xmn,一般-Xmn的大小是-Xms的1/2左右,不要设置的过大或过小,过大导致老年代变小,频繁Full GC,过小导致minor GC频繁。如果不设置-Xmn,可以采用-XX:NewRatio=2来设置,也是一样的效果;

    -Xss一般是不需要改的,默认值即可。

    -XX:SurvivorRatio一般设置8-10左右,推荐设置为10,也即:Survivor区的大小是Eden区的1/10,一般来说,普通的Java程序应用,一次minorGC后,至少98%-99%的对象,都会消亡,所以,survivor区设置为Eden区的1/10左右,能使Survivor区容纳下10-20次的minor GC才满,然后再进入老年代,这个与 -XX:MaxTenuringThreshold的默认值15次也相匹配的。如果XX:SurvivorRatio设置的太小,会导致本来能通过minor回收掉的对象提前进入老年代,产生不必要的full gc;如果XX:SurvivorRatio设置的太大,会导致Eden区相应的被压缩。

    设置Jvm参数

    例如要配置JVM参数如下:
    -server -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m -Xms1024m -Xmx1024m -Xmn512m -Xss256k -XX:SurvivorRatio=8 -XX:+UseConcMarkSweepGC

    说明:
    -XX:MetaspaceSize=128m (元空间默认大小)
    -XX:MaxMetaspaceSize=128m (元空间最大大小)
    -Xms1024m (堆最大大小)
    -Xmx1024m (堆默认大小)
    -Xmn512m (新生代大小)
    -Xss256k (棧最大深度大小)
    -XX:SurvivorRatio=8 (新生代分区比例 8:2,Eden/s0)
    -XX:+UseConcMarkSweepGC (指定使用的垃圾收集器,这里使用CMS收集器)
    -XX:+PrintGCDetails (打印详细的GC日志)

    JDK8之后把-XX:PermSize 和 -XX:MaxPermGen移除了,取而代之的是
    -XX:MetaspaceSize=128m (元空间默认大小) -XX:MaxMetaspaceSize=128m (元空间最大大小)
    JDK 8开始把类的元数据放到本地化的堆内存(native heap)中,这一块区域就叫Metaspace,中文名叫元空间。
    使用本地化的内存有什么好处呢?最直接的表现就是java.lang.OutOfMemoryError: PermGen 空间问题将不复存在,因为默认的类的元数据分配只受本地内存大小的限制,也就是说本地内存剩余多少,理论上Metaspace就可以有多大(貌似容量还与操作系统的虚拟内存有关?这里不太清楚),这解决了空间不足的问题。
    不过,让Metaspace变得无限大显然是不现实的,因此我们也要限制Metaspace的大小:使用-XX:MaxMetaspaceSize参数来指定Metaspace区域的大小。JVM默认在运行时根据需要动态地设置MaxMetaspaceSize的大小。


    $ java -server -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m -Xms1024m -Xmx1024m -Xmn512m -Xss256k -XX:SurvivorRatio=8 -XX:+UseConcMarkSweepGC -jar erbadagang-1.0.0.jar


    作者:梅西爱骑车
    链接:https://www.jianshu.com/p/e8cfa78ee8d7
    来源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    作者:梅西爱骑车
    链接:https://www.jianshu.com/p/e8cfa78ee8d7
    来源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 相关阅读:
    Java Thread(一) Outline
    Gradle学习(四) web工程构建
    Gradle学习(三) 依赖管理基础
    Gradle学习(二) Java Plugin
    Gradle学习(一)
    二维码zxing源码分析(五)精简代码
    二维码zxing源码分析(四)wifi部分
    二维码扫描 zxing源码分析(三)result、history部分
    二维码zxing源码分析(二)decode部分
    二维码zxing源码分析(一)camera部分
  • 原文地址:https://www.cnblogs.com/telwanggs/p/14919156.html
Copyright © 2011-2022 走看看