调优案例分析与实战
32位问题:
内存回收导致的长时间停顿,譬如十几个小时乃至一天才出现一次Full GC放在深夜执行
现阶段64位JDK性能测试普遍低于32位
相同程序在64位JDK中消耗的内存一般比32位JDK大,由于指针膨胀及数据类型对齐补白造成
集群间同步导致内存溢出:
集中的缓存JBossCache出现内存溢出,-XX:+HeapDumpOnOutOfMemoryError打印dump文件
减少写操作
堆外内存导致的溢出错误:
Direct Memory并不计算在堆内存里
对外内存只能每次等FullGC的时候顺带着帮它清理内存废弃对象,当出现异常发出gc信号要是虚拟机没有作为。。呵呵呵
除此之外:
线程堆栈Stack不在
socket缓冲区receive和send分别占37KB和25KB,连接过多Too many open files
JNI调试本地库,那本地库的内存也不在堆中
虚拟机和GC代码执行也要消耗内存
外部命令导致系统缓慢:
用户开发者调用了shell,去fork了进程
服务器JVM进程崩溃:
异步调用第三方服务,由于第三方服务响应慢,hang住了很多异步线程
eclipse调优实战
省略
类文件结构
jvm解释的class类文件结构
伪结构数据类型:无符号数和表
魔数:class文件的头4个字节,用来明确是否为一个能被jvm接受的class文件(0xCAFEBABE)
紧接着4个字节,class文件的主次版本号
紧接着的是,常量池入口,容量计数从1开始而不是0,常量池主要存放:字面量和符号引用(类和接口的全限定名、字段的名称和描述符、方法名称和描述符)
紧接着2个字节,访问标志(类还是接口,public还是private,final,abstract。。)
javap:用来分析class文件字节码的工具
类索引、父类索引与接口索引:通过索引值可以找到定义在常量池中的全限定名字符串
字段表:
用于描述接口或类中声明的变量,后面可能会跟着属性表描述信息
public、static、final、volatile、transient、字段数据类型(基本类型、对象、数组)、字段名
全限定名:仅仅是把全类名的.换成/,
简单名称:没有类型和参数修饰的方法或字段名称,去掉括号之类
方法或字段的描述符:基本数据类型、void、L+对象的全限定名
方法表:
与字段表几乎完全一致,仅访问标志和属性集合可选项有所区别
方法经编译后放在方法属性表中
属性表集合:
对于每个属性,名称需要从常量池中引用一个CONSTANT_Utf8_info类型的常量
code属性:
exception属性:
localVariableTable属性:
localVariableTypeTable属性:泛型
sourceFile属性:用于记录生成这个class文件源码文件名称
constantValue属性:
innerClasses属性:?
deprecated和synthetic属性: