9159金沙游艺场

图片 18
(转)网页性能管理详解
图片 1
Java面试笔试-001-Java语言的优点

jvm调优实战:为京东印尼商品服务接口调优

商品接口是印尼平台的基础服务,运行期间大对象不多,查询接口大多也有分页数量的限制。大boss也为关键接口设定了削峰计划——tp99不超过200ms。大多数情况下系统满足该要求,但是偶尔会有超过200ms的情况,一部分是由于查询数据量过大数据库响应和数据组装耗时所致,而另一部分则和jvm有关。通过观测发现,jvm进行一次young
gc耗时在100ms以上,full
gc耗时更是达到了1s左右,大概一天一次,部分超过200ms的调用恰恰就在gc的节点上。

Source作为公司内部代码托管工具,用户通过git的push、pull、clone等操作以及在web端查看代码进行代码对比的操作都将在短时间内产生大量的对象,并且这些对象的存活时间也不会很长。

1、指定垃圾收集器

  • -XX:+UseSerialGC
    指定使用串行垃圾收集器,新生代及老年代都是串行收集,在大堆或者多核cpu的环境中不大适合使用该种垃圾收集器
  • -XX:+UseParallelGC,并行垃圾收集器,新生代使用并行收集,老年代使用串行收集
  • -XX:+UseParallelOldGC,并行垃圾收器,新生代使用并行手机,老年代使用并行收集,在一些低版本的JVM该参数不支持或者不生效,这两种垃圾收集适合不在乎延时需要高吞吐的环境下使用,比如说一些批处理程序,
  • -XX:+UseConcMarkSweepGC,并发垃圾收集,新生代使用并行收集,老年代采用并发收集,适合低延迟应用使用该种垃圾器。使用并发垃圾收集,相当于自动添加了参数-XX:+UseParNewGC
  • -XX:+UseG1GC,使用G1垃圾收集,该种垃圾收集器比较复杂,目前在此种垃圾收集的调优经验较少,在需要大堆的应用可以考虑使用,相比并发垃圾收集器,其产生的碎片更少,且可以通过参数控制垃圾收集过程中的停顿时间。

调优之前使用部署系统默认的垃圾收集策略,即parallel
Scanvenge,堆空间2g,出现的问题是:

调优之前jvm使用的垃圾回收策略是新生代老年代均使用parallel
Scanvenge,也就是默认策略,堆大小为2G。出现的问题是:

2、调整堆大小

在描述调整堆大小参数,先用一张图描述JVM堆的分布情况:

图片 1

3116850-cfdf674a23e31255.png

其中新生代由Eden和s0和s1组成,有时候s0也叫做from,s1叫做to。现代JVM都是将堆分成几个不同的区间,划分的方法主要是根据对象的存活时间长短将整个jvm内存分为新生代,老年代、永久代。相应的主要参数有:

  • -Xms<n>[g|m|k]:调整堆的最小大小,比如:-Xms1G,表示堆最小为1G,在系统启动阶段JVM直接向系统申请1G内存,此参数相当于参数-XX:InitialHeapSize=n[g|m|k];
  • -Xmx<n>[g|m|k]:调整堆的最大大小,比如:-Xms1G表示堆最大为1G,此参数相当于参数-XX:MaxHeapSize=n[g|m|k];
  • -XX:MinHeapFreeRatio=n,指定堆最小空余比例,当堆中空余内存比例小于该参数指定值时,JVM将增大内存大小直到最大堆大小,默认40;
  • -XX:MaxHeapFreeRatio=n,指定堆最大空余比例,当堆中空余比例大于该参数制定值,JVM将减少内存大小,直到最小堆大小,默认为70;
    JVM将在发生FGC之后,根据这两个参数调整整个对的大小,FGC一般消耗的时间较多,为了降低延迟,一般将最小堆大小和最大堆大小设置成一样的。
  • -XX:NewRatio=n,老年代与新生代内存占比,-XX:NewRatio=4表示年轻代是老年代内存的1/4,也就是说年轻代占用总堆内存的1/5;
  • -XX:SurvivorRatio=n,Eden区与1个survivor区域内存占比,-XX:SurvivorRatio=8,表示EdenEden区域的内存是一个survivor区域内存的8倍,一共两个survivor区域,因此survivor占用新生代的1/10;
  • -XX:PermSize=<n>[g|m|k],-XX:MaxPermSize=<n>[g|m|k],这两个参数用于制定永久代内存大小,这个两个参数在jdk8中已经失效;
  • -XX:MetaspaceSize=<n>[g|m|k],
    -XX:MaxMetaspaceSize=<n>[g|m|k],在jdk中使用这两个参数指定元数据空间大小;
  • -XX:TargetSurvivorRatio=n,设定survivor区的目标使用率,默认是50%;
  • -XX:MaxDirectMemorySize=<n>[g|m|k],设置直接内存的大小,在使用一些nio框架时最好设置一下此参数,此参数如果过小也有可能导致频繁触发FGC;
  • -Xss<n>[g|m|k],指定Java线程栈的大小,默认值受环境影响,Xss越大,进程能运行的最大线程数就少,如果设置的过小,容易导致StackOverflowError错误;
  1. 永久代初始内存64M设置过小
  2. Minor gc时间过长,平均一次超过100ms
  3. 垃圾收集的并行线程数43个,服务器是2核,线程数偏多4 一次full
    gc耗时1s左右
  1. 永久代初始内存64M设置过小,运行过程中永久代内存可达到90M
  2. Minor gc频繁,说明eden区内存不足
  3. Minor gc时间过长,平均一次需要80ms
  4. 垃圾收集的并行线程数43个,服务器是8核,线程数偏多
  5. Full gc频繁,平均是半个小时一次,一次full gc耗时800ms左右

3、收集gc日志

  • -verbose:gc,输出gc日志信息,默认输出到标准输出,参数与-XX:+PrintGCDetails作用一致;
  • -XX:+PrintGCDetails,打印gc日志,打印的出日志包含日志收集原因,歌区域变化情况,以及用时;
  • -XX:+PrintGCDateStamps,日志中输出时间戳;
  • -XX:+PrintGCTimeStamps,日志中输出时间戳,与PrintGCDateStamps参数不同的地方在于,此参数输出的时间是相对与应用启动时间的差值;
  • -Xloggc:filename,把gc日志信息输入到指定文件中,
  • -XX:+PrintGCApplicationStoppedTime,打印垃圾收集期间应用被暂停的时间;
  • -XX:+PrintGCApplicationConcurrentTime,垃圾收集之前打印出应用未中断的执行时间;
  • -XX:+UseGCLogFileRotation,
    -XX:GCLogFileSize=n,这两个参数用于设置gc文件滚动和设置滚动日志文件的个数,为了防止单个gc日志文件太大,生产上建议加上这两个参数;

相关文章

No Comments, Be The First!
近期评论
    功能
    网站地图xml地图