"04、性能与压力测试.pdf"
这篇文档主要探讨了性能与压力测试相关的主题,重点关注Java虚拟机(JVM)的内存模型、堆管理以及性能监控工具JConsole和JVisualVM的使用。以下是详细的知识点解析:
1. **JVM内存模型**
- **程序计数器**:它记录当前线程执行的字节码指令地址,不抛出`OutOfMemoryError`异常。
- **虚拟机栈**:每个方法执行时会创建栈帧,存储局部变量表、操作数栈、动态链接和方法返回信息。栈深度不足会导致`StackOverflowError`,扩展不足则引发`OutOfMemoryError`。虚拟机栈是线程隔离的。
- **本地方法栈**:类似虚拟机栈,但服务于本地方法,使用本地方法实现。
- **堆**:存放所有对象实例和数组,是垃圾收集的主要区域,分为新生代、老年代和(在Java 8之前的)永久代/(Java 8及以后的)元空间。
2. **堆内存细分**
- **新生代**:包括Eden、FromSurvivor和ToSurvivor空间,新生的对象通常先在Eden区分配,经历垃圾收集后存活的转移到Survivor区。
- **老年代**:长期存在的对象被分配到这里,占用较大内存。
- **永久代/元空间**:存储类元数据,Java 8以前在永久代,之后在元空间,使用物理内存,大小受限于系统内存。
3. **垃圾回收**
- Java 8的HotSpot VM移除了永久代,引入元空间,减少Full GC的发生,提高性能。
4. **JConsole与JVisualVM**
- **JConsole**和**JVisualVM**是用于监控Java应用程序的工具,可观察内存使用、CPU利用率、线程状态等,对本地和远程应用都支持。
- JVisualVM提供更丰富的功能,如内存泄漏检测、垃圾回收跟踪、运行时内存和CPU分析、线程分析等。
- 安装JVisualVM插件可以增强其功能,例如查看GC详细信息。
5. **线程状态**
- **运行**:当前正在执行的任务。
- **休眠**:线程处于sleep状态。
- **等待**:线程在wait状态,等待其他线程的通知。
- **驻留**:线程池中的空闲线程。
- **监视**:被阻塞的线程,等待获取锁。
通过这些工具和对JVM内存结构的理解,开发者可以有效地进行性能调优和排查内存泄漏问题,从而提升应用程序的稳定性和效率。