shamoshuizu
痒-
采纳率100%
2017-04-25 08:00 阅读 2.8k
已采纳

服务器大内存jvm配置.。。

5

公司现在要上线java项目,提供了32G的内存机器,8核,我要怎么设置jvm的大小,
如果设置的太大会不会gc回收的时间过长造成系统卡顿或者内存泄露,怎么在内存
利用和性能调优中权衡呢,就大神解答

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

1条回答 默认 最新

  • 已采纳
    oyljerry oyljerry 2017-04-25 08:13

    尽量不要调用System.gc(),它会触发fullgc,而fullgc的频率应该是尽量降低的。尽管有些第三方库调用了它,还是不推荐在应用逻辑或业务逻辑内调用它。

    如果重视实时性,建议分配较小的堆,单机运行多个jvm进程。采用标记清除算法,并打开内存压缩开关,指定gc线程数最多是cpu核心数,使用并行回收算法回收年轻代,年轻代尽量大,保证绝大多数对象都在年轻代回收,适当增加对象在幸存区的复制次数,减少fullgc次数和降低fullgc造成的停顿。注意控制PermGen大小,可通过反复测试找到整个应用使用的最大PermGen值,最终确定的值只需要比测试时验证的值稍大即可。适当减少线程栈内存尺寸,增加每进程可支持的线程数。

    如果重视吞吐量,对实时性没有要求,可以运行单机单jvm进程,采用大堆。

    注意新生代与年老代的比例,伊甸区与幸存区的比例,这两个比例。

    如果使用了jdk7,可以尝试下G1算法,它是目前最快的gc算法。

    注意,不论是重视实时性还是重视数据吞吐量,所有jvm进程堆内存最好不要超过物理内存的3/4,根据操作系统内运行的服务数量和其它进程占用的内存这一数字还需要调整。如果服务器只运行同样的java服务,3/4是个不错的参考数字。

    如果是作为服务器可在启动jvm时增加-server参数,这个参数针对服务器有些默认优化,可在此基础上基于测试结果和线上运行结果做针对性优化。另外,作为服务器的话,将最大堆和最小堆的值设为一样大,节省不断调整堆尺寸的cpu开销。

    参数不明白的可以上网查,本人认为比较重要的几个参数是:-Xms -Xmx -Xmn MaxTenuringThreshold GCTimeRatio UseConcMarkSweepGC CMSInitiatingOccupancyFraction SoftRefLRUPolicyMSPerMB

    点赞 1 评论 复制链接分享