"本次分享主要探讨了JVM在实际应用中的知识,包括Java运行原理、内存分配、垃圾回收机制以及如何进行性能优化。"
在Java应用程序的运行过程中,JVM(Java虚拟机)扮演着至关重要的角色。它负责管理程序的内存空间,执行字节码,并确保程序的高效运行。在《干什么?-jvm 实际应用》的分享中,重点讨论了以下几个方面:
1. **Java运行原理**:
Java源代码首先通过`javac`编译器转化为字节码(`.class`文件)。当使用`java`命令启动程序时,JVM会加载这些字节码,并根据-Xms和-Xmx参数设定的初始堆内存和最大堆内存来创建Heap。Java程序生成的对象将分配在堆内存的不同区域。
2. **内存结构**:
- **Method Area**(方法区):存储类的信息,如类名、常量池、字段和方法数据等。
- **Stack**(栈):每个线程都有自己的程序计数器、虚拟机栈、本地方法栈。栈帧随着方法的调用和返回而入栈和出栈,用于存储局部变量、操作数栈等。
- **Heap**(堆):存放所有实例对象和数组,是垃圾收集的主要区域。
3. **垃圾回收(Garbage Collection, GC)**:
- **标记清除**:标记活动对象,然后清除非活动对象。
- **复制**:将活动对象复制到新的空间,然后清理原空间。
- **标记压缩**(或移动):标记活动对象并将其紧凑化,移除空闲空间。
- **停止世界(Stop-The-World)**:GC期间,JVM会暂停所有应用线程以进行垃圾收集。
4. **垃圾回收器**:分享中提到了几种常见的垃圾回收器,例如年轻代的Minor GC(YGC)和老年代的Major GC(FGC)。不同的垃圾回收器有不同的工作策略和性能特点。
5. **性能优化**:
- **垃圾回收频率和耗时**:监控GC的频率和耗时,例如YGC每20秒一次耗时98ms,FGC每27分钟一次耗时319ms。
- **设置合适的堆大小**:根据系统稳定运行后的长期存活对象所占内存大小,动态调整堆大小。
- **选择合适的垃圾回收器**:例如,CMS(Concurrent Mark Sweep)回收器适合低延迟要求的应用。
6. **问题处理**:
- **延迟过长**:可以通过降低`initiatingOccupancyFraction`参数来减少延迟,调整年轻代大小,控制对象年龄,减少垃圾生成,比如减少线程数和对象数。
- **使用工具分析**:如使用`jstack`查看线程状态,`jmap`分析堆内存,但需要注意`jmap-dump`可能会导致应用暂停。
7. **线程状态**:
Java中的线程有多种状态,如新建(New)、运行(Runnable)、阻塞(Blocked)、等待(Waiting)、超时等待(Timed Waiting)和终止(Terminated),理解这些状态对于排查线程问题至关重要。
通过深入理解JVM的工作机制,开发者可以更好地优化应用程序的性能,避免因内存管理不当导致的性能瓶颈和稳定性问题。