《深入理解Java虚拟机》读书笔记四

调优案例分析与实战

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属性:

发布了212 篇原创文章 · 获赞 68 · 访问量 36万+

猜你喜欢

转载自blog.csdn.net/singgel/article/details/102628830