• JVM调优建议


    ms/mx:定义YOUNG+OLD段的总尺寸,ms为JVM启动时YOUNG+OLD的内存大小;mx为最大可占用的YOUNG+OLD内存大小。在用户生产环境上一般将这两个值设为相同,以减少运行期间系统在内存申请上所花的开销。
    NewSize/MaxNewSize:定义YOUNG段的尺寸,NewSize为JVM启动时YOUNG的内存大小;
    MaxNewSize为最大可占用的YOUNG内存大小。在用户生产环境上一般将这两个值设为相同,以减少运行期间系统在内存申请上所花的开销。
    PermSize/MaxPermSize:定义Perm段的尺寸,PermSize为JVM启动时Perm的内存大小;
    MaxPermSize为最大可占用的Perm内存大小。在用户生产环境上一般将这两个值设为相同,以减少运行期间系统在内存申请上所花的开销。
    SurvivorRatio:设置Survivor空间和Eden空间的比例

    VM有2个GC线程。第一个线程负责回收Heap的Young区。第二个线程在Heap不足时,遍历Heap,将Young区升级为Older区。Older区的大小等于-Xmx减去-Xmn,不能将-Xms的值设的过大,因为第二个线程被迫运行会降低JVM的性能。

    为什么一些程序频繁发生GC?有如下原因:
    程序内调用了System.gc()或Runtime.gc()。
    一些中间件软件调用自己的GC方法,此时需要设置参数禁止这些GC。
    Java的Heap太小,一般默认的Heap值都很小。
    频繁实例化对象,Release对象。此时尽量保存并重用对象,例如使用StringBuffer()和
    String()。

    如果你发现每次GC后,Heap的剩余空间会是总空间的50%,这表示你的Heap处于健康状态。许多Server端的Java程序每次GC后最好能有65%的剩余空间。

    经验之谈:
    1.JVM堆的大小决定了GC的运行时间。如果JVM堆的大小超过一定的限度,那么GC的运行时间会很长。
    2.对象生存的时间越长,GC需要的回收时间也越长,影响了回收速度。
    3.大多数对象都是短命的,所以,如果能让这些对象的生存期在GC的一次运行周期内,wonderful!
    4.应用程序中,建立与释放对象的速度决定了垃圾收集的频率。
    5.如果GC一次运行周期超过3-5秒,这会很影响应用程序的运行,如果可以,应该减少JVM堆的大小了。
    6.前辈经验之谈:通常情况下,JVM堆的大小应为物理内存的80%。
    7.Server端JVM最好将-Xms和-Xmx设为相同值。为了优化GC,最好让-Xmn值约等于-Xmx的1/3。
    8.一个GUI程序最好是每10到20秒间运行一次GC,每次在半秒之内完成.

  • 相关阅读:
    使用java多线程模拟一个售票系统
    STM32F4X DMA
    Apache Dubbo 高危漏洞
    Java:如何加速Java中的大型集合处理
    Sevlet规范:HttpServlet类 和 HttpServletRequest接口 源码解析
    python+opencv实现人脸微整形
    java中需要加入依赖才能使用的注解
    数仓开发之DIM层
    Daos部署要求
    Kaldi 入门使用教程
  • 原文地址:https://blog.csdn.net/caryxp/article/details/133195879