jv m理解以及调优

### JVM理解及调优 #### 一、JVM概述与架构 JVM(Java Virtual Machine,Java虚拟机)是运行Java程序的核心环境,它不仅是一个操作系统上的应用程序或进程,更是一个具备自身生命周期与代码数据空间的独立运行环境。在深入讨论JVM的调优策略前,我们首先来了解一下JVM的基本架构。 **1.1 JVM图示** JVM的典型结构如图所示: - **程序计数器(Program Counter Register)**:当前线程所执行的字节码的行号指示器。 - **Java虚拟机栈(JVM Stack)**:用于存储局部变量表、操作数栈、动态链接、方法出口等信息。 - **本地方法栈(Native Method Stack)**:与虚拟机栈作用相似,但为虚拟机使用到的Native方法服务。 - **Java堆(Heap)**:JVM管理的最大一块内存区域,存放所有类实例和数组对象。 - **方法区(Method Area)**:用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。 **1.2 JVM运行数据区域的三大核心** - **Eden区**:新创建的对象一般会被放置于此区。 - **Survivor区**:分为From和To两个部分,通过多次垃圾回收,逐渐将对象迁移到该区域,以判断其是否值得长期保存。 - **Old区**:经过多次Survivor区筛选后存活下来的对象会被移动到这里。 #### 二、JVM的构成及其详解 **2.1 新生代与Old代** - **新生代**的大小对于性能有着重要影响。合理的新生代大小可以减少Full GC的发生频率,提升应用的整体性能。 - **Old代**中对象的回收速度通常低于Young代,这是因为Old代中的对象生存周期较长,往往不易被回收。 **2.2 对象晋升机制** - 在JVM中,对象的年龄(Age)默认设置为0,通过一系列的GC过程后,年龄达到一定阈值(默认为15)的对象会被晋升至Old代。 - 特殊情况下,即使对象年龄未达到15也会晋升到Old代,比如Survivor区中相同年龄的对象总和大于或等于Survivor区的一半时。 - 如果对象太大(例如,大型数组),则直接进入Old代。 **2.3 Metaspace** - Metaspace用于存储类元数据,其初始大小因平台而异(32位系统为12MB,64位服务器级系统为16MB)。 - Metaspace的一个重要特点是可动态扩展,可以通过设置最小和最大可用空间比例来控制其大小变化。 **2.4 Java对象内存逃逸技术** - 这种技术允许某些对象不在Heap区域内分配内存,从而减少了GC的频率和负担,提高了GC的效率。 - 内存逃逸技术可以应用于特定场景,例如使用本地内存分配等技术来实现。 #### 三、GC(Garbage Collection)原理与策略 **3.1 GC清除/标记算法** - 当内存空间耗尽时,GC会停止程序执行,执行标记和清除操作,标记所有可达对象,然后清除未被标记的对象。 **3.2 GC标记/整理** - 标记/整理算法在标记的基础上增加了对空闲内存块的整理操作,以减少内存碎片化。 **3.3 GC复制** - 复制算法将内存区域划分为多个相等的部分,每次只使用一部分,当这部分用完后,通过复制活对象到另一部分来实现垃圾回收。 **3.4 串行、并行、并发垃圾回收机制** - **串行垃圾回收**机制适用于资源较少的环境,因为它使用单一线程进行垃圾回收。 - **并行垃圾回收**机制利用多线程加速垃圾回收过程,适合多核处理器环境。 - **并发垃圾回收**机制使得垃圾回收与应用程序同时进行,极大地减少了应用的暂停时间。 #### 四、特定GC策略详解 **4.1 CMS(Concurrent Mark Sweep)收集器** - CMS收集器主要用于减少Full GC对应用程序的影响,通过并发标记和清理阶段来实现。 - CMS收集器在Full GC时,除了最初标记和重标记阶段外,其余过程都是并发执行的,这大大降低了GC暂停时间。 **4.2 Serial收集器** - 单线程方式进行垃圾回收,现在已经较少使用。 **4.3 ParNew收集器** - 使用多线程并行执行垃圾回收,适用于多核处理器环境,提高整体吞吐量。 **4.4 Parallel收集器** - 类似于ParNew,但提供了更多的吞吐量控制选项。 **4.5 G1收集器** - 相对较新的收集器,设计目的是取代CMS收集器,采用分区管理堆内存的方式,可以在不显著增加暂停时间的前提下处理较大的堆。 #### 五、案例分析与工具 **5.1 MAT对dump文件分析** - MAT(Memory Analyzer Tool)可以帮助分析Java应用程序的内存使用情况,包括浅堆(Shallow Heap)和深堆(Retained Heap)等指标。 - **浅堆**表示对象自身占用的空间。 - **深堆**则是指该对象及其子对象共同占用的空间总和。 通过以上内容的详细介绍,我们可以看到JVM的复杂性和调优的重要性。正确的理解和运用JVM的相关概念和技术,不仅可以提高应用程序的性能,还能降低资源消耗,优化系统的整体表现。





















剩余42页未读,继续阅读

- 粉丝: 45
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 小游戏五子棋JAVA程序设计.doc
- 综合项目管理大知识标准体系.docx
- 江苏省建设厅项目管理表样本.doc
- 系统集成项目管理工程师考试题库系统集成技术试题汇中样本.doc
- 上半年信息系统项目管理师参考答案及解析.doc
- 物联网期末设计.doc
- 运筹学图与网络分析.ppt
- 如何做好软件系统演示.ppt
- 基于RRTConnect算法的双履带起重机路径规划研究论文.doc
- 网络工程专业大学生职业生涯规划书范文字.doc
- 开放型计算机网络实验室建设路径研究获奖科研报告论文.docx
- 愿望网站策划案.doc
- 网络传播概论全书整本书电子教案教学教程.pptx
- 网络设备调试员(高级)实践操作题.doc
- 数控编程的工艺处理ppt课件.ppt
- (完整版)螺纹连接计算(附Excel计算).doc



- 1
- 2
前往页