启动时输出jvm所有的配置
- -XX:+PrintFlagsFinal
启动时输出非默认的jvm参数(人为配置的)
- -XX:+PrintCommandLineFlags
循环放置安全点
- -XX:+UseCountedLoopSafepoints
设置默认的hashcode
-XX:hashCode=0
此类方案返回一个Park-Miller伪随机数生成器生成的随机数-XX:hashCode=1
此类方案将对象的内存地址,做移位运算后与一个随机数进行异或得到结果-XX:hashCode=2
永远返回固定值1-XX:hashCode=3
此类方案返回一个自增序列的当前值-XX:hashCode=4
此类方案返回当前对象的内存地址
内存
1. -Xms1024m
最小堆内存大小(memory start)
2. -Mmx2048m
最大堆内存大小(memory max)
3. -XX:+UseCompressedOops
开启普通对象的指针压缩,此参数也会默认开启UseCompressedClassPointers
一个对象的指针默认为8字节(64bit),压缩后变为4字节(32bit),最大可表示4G(2^32),经JVM处理之后最大可访问地址为32G(堆内存大于32G时会自动失效)
为什么压缩后用4字节就可以最大访问32G呢,因为根据jvm对象对齐空间来算(ObjectAlignmentInBytes默认是8),也就是按照最小对象8字节来算有8个空挡(间隔),所以2^32*8bit=32G
开启之后会在机器码中植入压缩与解压指令,会给JVM增加额外的开销
在jdk6以后不是clientVM且是64位的jvm中默认为开启状态
4. -XX:+UseCompressedClassPointers
开启在对象头中类指针的压缩
如果UseCompressedOops是关闭的状态,则会报错
5. -XX:ObjectAlignmentInBytes=8
对象对齐空间大小(bit)默认为8
锁
-XX:-UseBiasedLocking
关闭偏向锁、jdk1.6之后默认为开启偏向锁。偏向锁竞争时会STW,如果竞争过于激烈,会导致性能下降
-XX:BiasedLockingStartupDelay=4000
jvm启用偏向锁延迟时间,偏向锁的信息都是在markword(对象头)里面,刚出生的对象markword信息都是由对应的Klass中的prototype_header(包含锁标识、epoch)决定的
默认启动4秒之后会把所有的klass的prototype_header中的数据标识为匿名偏向锁,只有匿名偏向锁才可以使用偏向锁
延时机制是为了解决:JVM启动时必不可免会有大量sync的操作,而偏向锁竞争时会STW并升级为轻量级锁。如果开启了偏向锁,竞争会发生大量锁撤销和锁升级操作,大大降低JVM启动效率
-XX:BiasedLockingBulkRebiasThreshold=20
偏向锁批量重偏向阈值,因为默认只能锁升级,升级轻量级锁需要等待全局安全点,会耗费性能
如果某个class的对象的偏向锁升级轻量级锁次数达到第20次时,则会标识第20个(包含)之后的对象全部可以偏向新的线程,避免升级为轻量级锁
批量重偏向(bulk rebias)机制是为了解决:一个线程创建了大量对象并执行了同步操作,后来另一个线程也来将这些对象作为锁对象进行操作,这样会导致大量的偏向锁升级为轻量级锁
重偏原理是修改klass的prototype_header中的epoch,做+1操作,这样偏向锁上锁时检测epoch为失效状态,就会重新使用CAS上锁
-XX:BiasedLockingBulkRevokeThreshold=40
偏向锁批量撤销阈值,撤销之后直接从轻量级锁开始。同上,如果锁升级过多,在25秒(如下参数设置)内,超过40次,则直接撤销当前class对应所有对象的偏向锁,后续一律从轻量级锁开始
撤销的原理是:刚出生的对象markword信息都是由对应的Klass的决定的,修改Klass中的prototype_header弃用偏向锁即可
批量撤销(bulk revoke)机制是为了解决:在明显多线程竞争剧烈的场景下使用偏向锁是不合适的
-XX:BiasedLockingDecayTime=25000(默认)
同上,一定时间内的阈值