JVM整体架构
(一)、Java的优点之一是与平台的无关性,那它是怎么做到的呢?
Java语言与平台的无关性是使用Java虚拟机(JVM)是实现这一特点主要原因所在。
一般的语言如果要在不同的平台上运行,至少需要编译成不同的目标代码。而引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用模式Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。Java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。
所以JVM的重要性显而易见。
(二)、JVM的整体架构是什么样子呢?
主要包括两个子系统和两个组件:
(1)、 Class loader(类装载器) 子系统;
(2)、Execution engine(执行引擎) 子系统;
(3)、Native interface(本地接口)组件;
(4)、Runtime data area (运行时数据区域)组件
结构图如下:
<!--[endif]-->
(1)、 Class loader(类装载器) 子系统;
根据给定的全限定名类名(如 java.lang.Object)来装载class文件的内容到 Runtime data area中的method area(方法区域)。Javsa程序员可以extends java.lang.ClassLoader类来写自己的Class loader。
(2)、Execution engine(执行引擎) 子系统;
执行classes中的指令。任何JVM specification实现(JDK)的核心是Execution engine, 换句话说:Sun的JDK 和IBM的JDK好坏主要取决于他们各自实现的Execution engine的好坏。每个运行中的线程都有一个Execution engine的实例。
(3)、Native interface(本地接口)组件;
Native interface与native libraries交互,是其它编程语言交互的接口。
(4)、Runtime data area (运行时数据区域)组件
运行时数据区域组件包含:Heap (堆)、 Method Area(方法区域)、Java Stack(java的栈)、Program Counter(程序计数器)、Native method stack(本地方法栈);
Heap 和Method Area是被所有线程的共享使用的;而Java stack, Program counter 和Native method stack是以线程为粒度的,每个线程独自拥有。
Heap Java程序在运行时创建的所有类实或数组都放在同一个堆中。而一个Java虚拟实例中只存在一个堆空间,因此所有线程都将共享这个堆。每一个java程序独占一个JVM实例,因而每个java程序都有它自己的堆空间,它们不会彼此干扰。但是同一java程序的多个线程都共享着同一个堆空间,就得考虑多线程访问对象(堆数据)的同步问题。 (这里可能出现的异常java.lang.OutOfMemoryError: Java heap space)
Method Area 在Java虚拟机中,被装载的class的信息存储在Method area的内存中。当虚拟机装载某个类型时,它使用类装载器定位相应的class文件,然后读入这个class文件内容并把它传输到虚拟机中。紧接着虚拟机提取其中的类型信息,并将这些信息存储到方法区。该类型中的类(静态)变量同样也存储在方法区中。与Heap一样,method area是多线程共享的,因此要考虑多线程访问的同步问题。比如,假设同时两个线程都企图访问一个名为Lava的类,而这个类还没有内装载入虚拟机,那么,这时应该只有一个线程去装载它,而另一个线程则只能等待。 (这里可能出现的异常java.lang.OutOfMemoryError: PermGen full)
Java栈(Java Stack)是线程私有的,它的生命周期与线程相同。Java stack以帧为单位保存线程的运行状态。虚拟机只会直接对Java stack执行两种操作:以帧为单位的压栈或出栈。每当线程调用一个方法的时候,就对当前状态作为一个帧保存到java stack中(压栈);当一个方法调用返回时,从java stack弹出一个帧(出栈)。栈的大小是有一定的限制,这个可能出现StackOverFlow问题。
程序计数器(Program counter)是一块较小的内存空间,它的作用可以看做是当前线程所在会想的字节码的行号指示器。字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令、分支、循环、跳转、异常处理线程恢复等基础功能都需要依赖这个计数器来完成。 每个运行中的Java程序,每一个线程都有它自己的PC寄存器,也是该线程启动时创建的。PC寄存器的内容总是指向下一条将被执行指令的地址,这里的地址可以是一个本地指针,也可以是在方法区中相对应于该方法起始指令的偏移量。
Native method stack 对于一个运行中的Java程序而言,它还能会用到一些跟本地方法相关的数据区。当某个线程调用一个本地方法时,它就进入了一个全新的并且不再受虚拟机限制的世界。本地方法可以通过本地方法接口来访问虚拟机的运行时数据区,不止与此,它还可以做任何它想做的事情。比如,可以调用寄存器,或在操作系统中分配内存等。总之,本地方法具有和JVM相同的能力和权限。 (这里出现JVM无法控制的内存溢出问题native heap OutOfMemory );
相关推荐
堆栈结构是 JVM 中重要的内存管理组件之一。它主要用于存储方法调用过程中的局部变量、操作数栈等数据。每个线程在其生命周期内都会有一个对应的堆栈结构,其中包含了一个或多个帧(Frame)。每个帧对应一个方法调用...
JVM内存模型是JVM设计中最核心的部分之一,主要包括以下几部分: ##### 3.1 线程私有区域 - **Java虚拟机栈**:每个线程创建时都会有一个虚拟机栈。每当线程执行一个方法时,都会为这个方法创建一个栈帧,用于存储...
JVM性能监控与调优实战课程,作为整篇课程的重中之重,非常值得同学们参考学习。课程前端讲解了JVM的性能监控和调优的概述,对调优的的方法和工具进行讲解学习,让同学们掌握方法,理解知识。课程的中间阶段我们进行...
ARM芯片,作为RISC架构的代表之一,通过增加更多指令(如16位Thumb指令、DSP指令和Java字节码指令)和增强内存访问能力来提升性能。ARMv5TEJ核心版本中,"v5"表示版本号,"T"表示支持缩小版的Thumb指令集,"E"表示...
在Java开发过程中,深入理解JVM如何加载Class文件至关重要,尤其是在面试时,这一知识点往往是考察的重点之一。下面将详细阐述JVM加载Class文件的基本原理及其背后的机制。 **1. 类的动态加载** Java类的加载过程...
Java应用程序在JVM的虚拟化环境中运行,而JVM本身作为一个本机进程,运行在操作系统之上。这意味着除了Java堆之外,JVM还依赖于本机内存来存储各种数据结构和资源,如类加载器、类元数据、线程信息、本机方法调用的...
为了深入理解JVM的垃圾收集特性,首先需要对JVM的整体架构有所了解。JVM是支持Java程序运行的虚拟机,它能够在各种硬件平台和操作系统上实现“一次编写,到处运行”的目标。JVM的主要组成部分包括程序计数器、Java堆...
2. **移动开发**:Android平台上的应用程序也是运行在JVM的一个变种Dalvik虚拟机之上。 3. **大数据处理**:许多大数据处理框架,如Hadoop、Spark等,也采用了Java作为主要开发语言。 #### 结论 Java虚拟机(JVM)...
在深入探讨Java虚拟机(JVM)时,我们再次聚焦于这个核心组件,它不仅是Java运行环境的心脏,也是构建分布式应用的关键技术之一。JVM作为Java语言的核心执行环境,其设计与优化对分布式系统的性能、可扩展性和可靠性...
- **位置**: JVM运行在操作系统之上,并不直接与硬件交互。 - **执行流程**: - 编译:源代码由Java编译器编译成字节码(.class文件)。 - 加载:字节码文件由类加载器加载至JVM内存中。 - 执行:JVM解释执行字节码...
JVM的整体结构包括以下几个关键部分: 1. **类加载器**:负责加载Java类文件,验证其语法和安全,然后分配内存。 2. **运行时数据区**:包含堆、栈、方法区、本地方法栈等,用于存储程序运行时的数据。 3. **执行...
《深入理解Java虚拟机_JVM高级特性与最佳实践 第2版》是一本专注于Java开发者深入探索JVM(Java Virtual Machine)的重要参考资料。本书全面讲解了Java虚拟机的内部工作机制,涵盖了JVM的高级特性和最佳实践,旨在...
JVM(Java Virtual Machine)是 Java 语言的核心组件之一。JVM 架构图展示了 JVM 的整体结构,包括 Class Loader、Runtime Data Areas、Execution Engine、Native Method Interface 等组件。JVM 的主要功能是将 Java...
作为标签中提及的“java”,Java编程语言是成为一名优秀架构师的必备技能之一。你需要深入理解Java语法,包括类、对象、接口、继承、多态等核心概念。同时,要掌握异常处理、集合框架(如ArrayList、LinkedList、...
通过学习这套【Java代码与架构之完美优化】课件,开发者不仅能够掌握Java编程的深度技巧,还能提升整体架构设计能力,从而在实际项目中实现更高效、更稳定、更易于维护的代码和系统。配合配套的课件,理论结合实践,...
内存管理是 JVM 性能的关键因素之一。WAS 中的 JVM 采用了一种名为“代际垃圾回收”的策略。这种策略将堆空间划分为不同的区域(代),比如年轻代和老年代。年轻代主要用于存储新创建的对象,而老年代则用于存储长期...
JVM内存管理是Java开发人员必须掌握的核心技能之一,尤其对于性能优化至关重要。JVM内存模型主要包括以下几个部分: 1. **直接内存**:指不通过Java堆而是通过本机系统直接分配的内存。这种方式可以显著提高内存...
ODI的整体架构相对简单明了,主要包括以下几个核心组成部分: 1. **模型资料库(Model Repository)**:这是ODI的核心组件之一,用于存储ODI模型设计过程中产生的元数据信息,例如数据转换规则、数据库连接信息等。...