kafka 启动报错
问题现象:
不承认的虚拟机参数
1.启动脚本 kafka-server-start.sh
2.查看这个脚本,发现里面还调用了kafka-run-class.sh
3.打开kafka-run-class.sh,找到参数,删除就好了。
JVM优化之压缩普通对象指针(CompressedOops)
寻找 会’偷懒’的开发者线下公开课,报名即享受免费体验云主机
通常64位JVM消耗的内存会比32位的大1.5倍,这是因为对象指针在64位架构下,长度会翻倍(更宽的寻址)。 对于那些将要从32位平台移植到64位的应用来说,平白无辜多了1/2的内存占用,这是开发者不愿意看到的。 幸运的是,从JDK 1.6 update14开始,64 bit JVM正式支持了 -XX:+UseCompressedOops 这个可以压缩指针,起到节约内存占用的新参数。
什么是 OOP ?
OOP = “ordinary object pointer” 普通对象指针。
启用CompressOops后,会压缩的对象: ? 每个Class的属性指针(静态成员变量) ? 每个对象的属性指针 ? 普通对象数组的每个元素指针
当然,压缩也不是万能的,针对一些特殊类型的指针,JVM是不会优化的。 比如指向PermGen的Class对象指针,本地变量,堆栈元素,入参,返回值,NULL指针不会被压缩。
CompressedOops的原理
原理,解释器在解释字节码时,植入压缩指令(不影响正常和JVM优化后的指令顺序)。 具体逻辑是,当对象被读取时,解压,存入heap时,压缩。
压缩指令伪码
! int R8; oop[] R9; // R9 is 64 bits ! oop R10 = R9[R8]; // R10 is 32 bits ! load compressed ptr from wide base ptr: movl R10, [R9 + R8<<3 + 16] ! klassOop R11 = R10._klass; // R11 is […]