JVM深度解析:内存管理与垃圾回收

需积分: 9 2 下载量 113 浏览量 更新于2024-08-18 收藏 2.45MB PPT 举报
"本次部门分享主要探讨了JVM在实际应用中的重要性和各种细节,由邢晓兵在2016年12月的房产技术部进行分享。内容包括Java运行原理、内存区域划分、垃圾回收机制以及如何进行JVM调优。" ### Java运行原理 Java程序的执行分为几个步骤: 1. **Java源代码**,如`Dog.java`,首先由**Java编译器**(javac)编译成字节码文件`Dog.class`。 2. 使用`java`命令启动JVM,例如`java -Xms4g -Xmx4g com.fangchan.xxb.Dog`,其中`-Xms`和`-Xmx`分别设置JVM初始堆内存和最大堆内存。 3. **内存分配**:在JVM中,内存被划分为几个主要区域,包括**Method Area(方法区)**存储类的信息,**Stack(栈)**存储线程局部变量,以及**Heap(堆)**用于存储对象实例。 ### JVM内存结构 - **Method Area**:存放类的信息,如类名、常量池、字段和方法数据等。 - **Stack**:每个线程都有自己的程序计数器、虚拟机栈和本地方法栈,用于存储方法调用的局部变量和计算结果。 - **Heap**:对象实例都在堆中创建,通过垃圾回收机制管理内存。 ### 垃圾回收(GC) - **GC何时进行**:当内存不足或达到特定条件时,JVM会启动垃圾回收。 - **GC在哪进行**:主要针对Heap区域,清理不再使用的对象。 - **GC做什么**:识别并释放无引用的对象,以便回收内存。 - **GC如何进行**:包括多种算法,如**标记清除**、**复制算法**、**标记整理**等。 ### 常见垃圾回收器 - **年轻代**(Young Generation)GC(YGC):频繁进行,回收新生代中的垃圾。 - **老年代**(Tenured Generation)GC(FGC):较少发生,回收老年代中的垃圾。 ### JVM调优 - 调优目标:尽量减少Full GC,确保应用稳定运行。 - 方法一:初期不设参数,让JVM自适应调整,然后根据长期运行情况设定堆大小。 - 方法二:根据应用特点,适当设置堆大小,使eden、survivor和old generation满足需求。 ### 调整策略 - 减少`initiatingOccupancyFraction`以降低触发Full GC的阈值。 - 调整年轻代和生存区大小,优化对象晋升策略。 - 减少垃圾生成,如减少线程数、控制对象创建。 ### 监控工具 - **jstack**:查看线程状态,帮助分析死锁或阻塞问题。 - **jmap**:提供内存快照,如`-dump`生成heap dump,`-histo:live`统计对象分布,但可能影响应用。 ### 应用实践 分享还提到了线上详情页的FGC情况,以及不同线程状态的分析,结合`jmap`和`Eclipse Memory Analyzer`等工具,深入理解堆上的对象状态,有助于优化JVM配置,提高应用性能。 这次分享深入探讨了JVM的实际运用,强调了正确理解和调优JVM对于优化Java应用性能的重要性。通过理解Java运行机制,掌握垃圾回收的工作原理,以及有效利用监控工具,开发者可以更好地管理应用的内存,减少性能瓶颈,提升系统稳定性。