博客
关于我
Java虚拟机结构(内存,类加载器,执行引擎)
阅读量:476 次
发布时间:2019-03-07

本文共 1583 字,大约阅读时间需要 5 分钟。

Java虚拟机(JVM)深入解析

Java虚拟机(JVM)是Java программ运行的核心,其在技术应用中占据着重要地位。本文将从多个维度探讨JVM的工作原理及实现机制,帮助开发者深入理解Java应用的执行环境。

一、JVM的背景知识

Java诞生于1995年,由Sun公司开发,其核心目标是“一次写,随处运行”(Write Once, Run Anywhere)。2006年,Sun将JDK开源,建立了OpenJDK组织,负责管理和开发JVM源码。2009年,Sun被Oracle收购,现在OpenJDK下的JVM发展越发繁荣。

市场上涌现出多个JVM实现,如Oracle的JRockit和HotSpot,沿以IBM的JVM相互竞争。这两大虚拟机分别采用不同的优化策略,适用于不同的应用场景。JVM的运转管理着现代应用的性能表现,理解其内部机制至关重要。

二、JVM的结构概述

每个JVM主要由两个核心部分构成:

  • 类加载器子系统:负责将class文件加载到内存中,实现类与实例的管理。
  • 执行引擎:解析字节码并执行,实现程序的执行命令。
  • JVM的运行环境分为三个主要内存区域:

    堆是JVM中唯一用于存放实例对象的内存区域,主要负责程序中动态创建的对象。

    • 垃圾收集器负责对不再使用的对象执行回收工作,称为GC堆。
    • 堆容量的大小通常由程序需求决定。

    方法区

    方法区存储类和类信息,是所有Java程序共享的资源。

    • 特点为属于非堆内存,其操作较为高效。
    • 包含常量池、字段、方法等信息。

    虚拟机栈

    为每个线程私有,存储局部变量、操作数栈及函数调用信息。

    • 每个函数调用的执行都伴随栈帧的生成和处理。

    本地方法栈

    为本地方法(Native Method)执行提供内存区域。

    • 不同JVM实现方式各异,部分虚拟机将其与虚拟机栈合并。

    每块内存区域之间具备特定的功能分工,合理利用内存结构是优化应用性能的关键。

    三、类加载子系统

    类加载子系统(Class Loader Subsystem)的工作流程包含验证、准备、解析和初始化四个阶段,确保类的加载安全稳定。

    类加载触发时间

  • 创建新对象(new)、读取/设置静态字段(putstatic、getstatic),调用静态方法(invokestatic)。
  • 初始化类(construct classes),如初始化主类、反射调用时的类加载。
  • 虚拟机启动时加载主类。
  • 反射调用时的类初始化。5.읽取方法句柄的最终解析(JDK 1.7及以后的动态语言支持)。
  • 类加载过程

  • 验证:确保字节码格式准确无误,完成多维度的数据校验。(如文件格式、元数据、字节码验证等)。
  • 准备:为静态变量分配内存,赋值(如默认值、常量值等)。
  • 解析:将符号引用转换为直接引用,解析到具体的地址。
  • 初始化:执行类构造器(init-backup)的程序,初始化静态字段和静态代码块。
  • 类对象与多态机制

    每个JVM仅维护一个类对象,用以关联内存中的用例和资源,反射、 JNI 等API通过此实现多态调用。

    四、执行引擎

    执行引擎称为JVM的核心,负责对二进制码的解析和执行。

    即时编译器(JIT)

    主要用于提高程序执行效率,将热点代码(频繁调用方法或循环体)转译为机器码,提升运行速度。HotSpot虚拟机内置两种JIT编译器:Client Complier适用于普通客户端应用,Server Complier专为服务器端开发。

    五、工作中参考资料

    • 《深入理解Java虚拟机》(著者:周志明)
    • 《高性能Java》(著者:Joshua Bloch)
    • 《Java虚拟机规范》(Java Language Specification)

    通过对JVM的深入了解,可以更好地理解Java程序的运行机制,进行内存优化或性能调优工作。这不仅提升开发效率,也为项目优化奠定基础。

    转载地址:http://yzedz.baihongyu.com/

    你可能感兴趣的文章
    uio 设备文件创建以及 iommu 导致 x710 网卡初始化失败问题
    查看>>
    patchelf 的功能以及使用 patchelf 修改 rpath 以解决动态库问题
    查看>>
    关调度与关中断
    查看>>
    rt-thread 使用心得
    查看>>
    c 语言结构体 padding 的问题
    查看>>
    Leetcode第557题---翻转字符串中的单词
    查看>>
    IDEA:修改编辑区背景色
    查看>>
    VS 用户自定义控件未出现在工具箱的解决方案
    查看>>
    正则表达式用法
    查看>>
    IDEA Properties中文unicode转码问题
    查看>>
    CSS 不换行
    查看>>
    VS 单元测试报错处理 Castle.Core
    查看>>
    C# datagridview行号自适应宽度
    查看>>
    C# WinForm 圆角button
    查看>>
    .mpp文件在线打开网址
    查看>>
    C#中的委托(delegate)
    查看>>
    error C2061: syntax error : identifier 'string'
    查看>>
    webservice调用报错 SAXException
    查看>>
    Problem G. The Stones Game【取石子博弈 & 思维】
    查看>>
    洛谷多校第2轮.E——Anan and Minecraft【并查集】(判断图同构)
    查看>>