jvm性能优化到底在优化什么?

1、jvm中的stop the world

  • 我们要知道jvm中的stop the world是指什么?我们都知道当程序运行的时候,创建的对象等数据是放在jvm堆内存上的
  • 当堆内存满了之后,jvm是会进行垃圾回收的,就是当jvm进行垃圾回收时会发生stop the world会停止其他的工作线程
  • 不能jvm一边回收着垃圾,工作线程那边创建着对象去占用内存吧,所以stw是会导致系统对用户来说产生卡顿停顿现象

2、jvm性能优化到底在优化什么?

  • jvm性能优化就是指的是通过内存的合理分配,以及合理的设置参数,避免jvm频繁的发生垃圾回收,减少系统停顿时间等。
  • jvm在年轻代发生的是yong Gc使用的是复制回收算法,一般使用的垃圾收集器是ParNew+CMS,复制回收算法效率较高,并且大部分对象都会再年轻代被回收掉(GcRoot跟路径扫描判断对象是否可回收),耗时较短
  • jvm在老年代会发生full Gc 使用的是标记整理发,垃圾回收时分为初始标记,并发标记,并发清理,内存整理等阶段,耗时较长一般能有 young gc耗时的10倍左右,并且老年代的对象大部分都是长期存活的对象,执行过full Gc之后回收掉无用对象剩余的空间可能还不够年轻代将要晋升老年代的对象空间,那么可能就会频繁发生full gc了
  • 所以总结下来jvm性能优化的本质就是:通过年轻代&老年代内存合理的分配,尽量让对象都在年轻代时被回收,尽量减少对象或者没有对象进入老年代,尽量做到长时间或者零full Gc

3、垃圾收集器选择

  • 一般针对小内存的机器可以使用ParNew+CMS当堆内存满了采用并行垃圾回收的方式,尽量缩短垃圾回收时间,减少系统卡顿时间,但是这种方式不能控制stw停顿时间,如果当机器内存较大比如32G,新生代分了20G内存,当新生代快满时进行young gc,一下子回收掉将近20G的内存,那么stw的时间肯定会比较长,所以针对较大内存的机器可能ParNew+CMS这种垃圾回收器就不太适合了。
  • 用G1来优化大内存机器的young gc的性能,G1垃圾收集器可以设置一个预期的GC停顿时间,比如100ms,G1垃圾收集器会把年轻代空间划分为一个个的逻辑Region区,会根据设置的预期停顿时长来预估每个Region的垃圾回收时间,选择能回收最多垃圾时长又在设置最大时长之内的Region区域进行回收,这样就可以让每次young gc的时候最多停顿100ms,避免影响用户使用。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章