chaosblade-help-zh-CN
  • README
  • blade
  • blade create
  • blade create cpu load
  • blade create disk burn
  • blade create disk fill
  • blade create mem load
  • blade create network delay
  • blade create network dns
  • blade create network drop
  • blade create network loss
  • blade create network corrupt
  • blade create network reorder
  • blade create network duplicate
  • blade create network occupy
  • blade create process kill
  • blade create process stop
  • blade create script delay
  • blade create script exit
  • blade create docker
    • blade create docker cpu
    • blade create docker network
    • blade create docker process
    • blade create docker container
  • blade create k8s
    • blade create k8s node-cpu
    • blade create k8s node-network
    • blade create k8s node-process
    • blade create k8s node-disk
    • blade create k8s pod-pod
    • blade create k8s pod-IO
    • blade create k8s pod-network
    • blade create k8s container-cpu
    • blade create k8s container-network
    • blade create k8s container-process
    • blade create k8s container-container
  • blade prepare jvm
  • blade create jvm
    • blade create jvm delay
    • blade create jvm return
    • blade create jvm script
    • blade create jvm cpufullload
    • blade create jvm OutOfMemoryError
    • blade create jvm CodeCacheFilling
    • blade create jvm throwCustomException
  • blade create servlet
    • blade create servlet delay
    • blade create servlet throwCustomException
  • blade server
  • blade status
  • blade version
Powered by GitBook
On this page
  • 介绍
  • 参数
  • 案例
  • 实现原理
  • 常见问题

Was this helpful?

  1. blade create jvm

blade create jvm CodeCacheFilling

Previousblade create jvm OutOfMemoryErrorNextblade create jvm throwCustomException

Last updated 3 years ago

Was this helpful?

介绍

CodeCache主要用于存放native code,其中主要是JIT编译后的代码。被JIT编译的一般都是“热代码”,简单说就是调用频率比较高的代码,JIT编译后,代码的执行效率会变高,CodeCache满会导致JVM关闭JIT编译且不可再开启,那么CodeCache满会引起系统运行效率降低,导致系统最大负载下降,当系统流量较大时,可表现为RT增高、QPS下降等。 命令可以简写为:blade c jvm ccf

参数

此场景无特有参数,通用参数详见:[blade create jvm](blade create jvm.md)

案例

注入 CodeCache 满故障:

blade c jvm CodeCacheFilling --process tomcat                                                                          

{"code":200,"success":true,"result":"f0e896f38c704894"}

实现原理

由于CodeCache主要存放JIT编译的结果,所以填充CodeCache分为两步,第一步是生成用于触发JIT编译的class,方式是通过动态编译生成大量的class;第二步是编译后生成的class进行实例化和频繁调用(“加热”),直到触发JIT编译后进入CodeCache区。通过这样方式不停的填充CodeCache,直到JIT编译关闭

常见问题

  1. 由于需要编译和“加热”代码,所以在填充的过程中CPU占用率会很高;并且会持续一段时间(测试中,默认大小的情况下,从无占用到填充满约5分钟,实际情况下,CodeCache都会有一定的使用率,所以时间不会那么长);

  2. 由于“加热”过程中需要实例化大量的class,会有大量对象一直无法被GC回收,有概率导致Metaspace满而产生OOM;

  3. 由于无法直接判断JIT编译是否关闭,所以只能根据CodeCache占用量来判断,但是JIT编译关闭时,CodeCache占用量的阈值并不能精准获取,所以是通过CodeCache的增长来判断的,如果5秒内CodeCache占用量都无变化,即判断JIT编译关闭(JIT编译关闭后,CodeCache占用量不再变化);

  4. 目前是根据CodeCache的默认大小来设计的(生成class数量等),即240M(jdk8 64bit),如果设置更大的CodeCache(-XX:ReservedCodeCacheSize)的话,持续时间会更长,甚至由于动态产生的class数量不够而导致无法填充满;

  5. 由于JIT编译关闭后不可再手工开启,所以该故障无法直接恢复,需要用户手工重启应用系统来恢复;