书籍摘要-深入理解java虚拟机
第一部分:走进 java
第一章:走进 java
第二部分:自动内存管理机制
第二章:java内存区域和内存溢出异常
java 虚拟机在执行 java 程序时将内存划分为 5 个部分。线程私有的有成员计数器、虚拟机栈、本地方法栈,线程共享的有方法区、堆。
程序计数器储存字节码行号,此区域未规定任何内存溢出异常。虚拟机栈储存栈帧,用于java 方法的运行。本地方法栈用于 native 方法运行。方法区用于存储已加载类的信息、常量、静态变量等。堆用于存储 java 对象。
运行时常量池是方法区的一部分,用于储存编译期生成的字面值和符号引用。
直接内存不是虚拟机数据区的一部分,通过 NIO 类可分配这些内存。
虚拟机如何创建一个对象?首先加载类,然后为对象分配内存,根据堆内存是否整齐采用指针碰撞或空闲列表方式。可以使用TLAB方式避免分配内存的线程间冲突。然后将内存赋值为0。然后设置对象头。最后执行init方法。
hotpot 虚拟机中,对象内存分为对象头、实例数据和对齐填充。对象头第一部分是 “Mark Word”,第二部分是类型指针。实例数据就是各类型字段的值。对齐填充起占位符作用。
访问对象:
访问对象有两种方式:句柄方式和直接指针方式。hotpot 虚拟机采用直接指针方式。
异常名称列举:
OutOfMemoryError StackOverFlowError
第三章:垃圾回收器和内存分配策略
如何找到无用对象?计数算法无法解决对象间循环引用问题,所以 java 没有采用。java 采用了可达性分析算法,GC roots 不可达的对象均是待回收的无用对象。GC roots 包含 4 种:栈中引用对象、方法区静态属性和常量、JNI 引用。
在 JDK1.2 之后,引用根据强弱分为 4 种。
在方法区中,废弃的常量和无效类也会被回收。
垃圾收集器有很多种,因为没有一种是完美的。
内存的分配策略。
第四章:虚拟机性能监控与故障处理工具
jdk 自带了一些命令行工具。
第五章:调优案例分析与实战
在高性能硬件部署应用,有 2 种方式:一是通过 64 位 jdk 来使用大内存,二是建立若干个 32 位 jdk 的逻辑集群。
集群间同步导致的内存溢出问题。
堆外内存导致的溢出错误。
外部命令导致系统缓慢。
服务器 JVM 进程崩溃。
不恰当数据结构导致内存占用过大。
windows 虚拟内存导致长时间的停顿。
对 Eclipse 运行速度的优化。
第三部分:虚拟机执行子系统
第六章:类文件结构