最近在看深入JAVA虚拟机这本书,JAVA虚拟机这章讲得很细致,粗略看了并整理一下,都是理论性的东东,不过收获很大。
1、java虚拟机可能指的三种不同的东西:抽象规范、一个具体的实现、一个运行中的虚拟机实例。
2、java虚拟机的生命周期
java虚拟机内部有两种线程:守护线程和非守护线程。守护线程是由java虚拟机自己使用,比如执行垃圾收集任务的线程;java程序也可以把创建的任何线程标记为守护线程,java程序中的初始线程是非守护线程。只要有任何非守护线程在运行,java程序也继续运行,虚拟机仍然存活;当该程序中所有的非守护线程都终止时,虚拟机实例将自动退出。
3、java虚拟机体系结构
java虚拟机体系结构图:一个类装载器子系统,装载类或接口;一个执行引擎,负责执行那些包含在被装载类中方法的指令; 一个运行时数据区,存储字节码、创建的对象、传递的参数、返回值、局部变量等。
I、类装载器子系统:
java虚拟机有两种类装载器:启动类装载器和用户自定义类装载器。前者是java虚拟机实现的一部分;后者则是java程序的一部分。
II、运行时数据区:某些运行时数据区是由程序中所有的线程共享 如图1;还有一些则只能有一个线程拥有。
图1
方法区&堆:
每个java虚拟机实例都有一个方法区以及一个堆,由该虚拟机实例的所有线程共享。当虚拟机装载一个class文件时,会从这个class文件包含的二进制数据中解析类型信息,然后把类型信息放到方法区中。
程序运行时,虚拟机把所有程序运行时创建的对象放到堆中。
PC寄存器&java栈&本地方法栈:
每个新线程被创建时,都将得到自己的PC寄存器以及一个java栈。若线程正在执行一个java方法,PC寄存器的值总是指示下一条被执行的指令;
java栈存储该线程中java方法调用的状态--包括局部变量、被调用时传进的参数、返回值以及运算的中间结果;
本地方法调用的状态,以某种依赖于具体实现的方式存储在本地方法栈中,也可能是寄存器或其他特定内存区。java栈是由许多栈帧组成,一个栈帧包含一个java方法调用的状态,当线程调用一个java方法时,虚拟机压入一个新的栈帧到该线程的java栈中,当该方法返回时,这个栈帧从java栈中弹出并抛弃。
a、方法区
类型信息,对每个装载的类型,虚拟机都会在方法区中存储以下类型信息:
这个类型的全限定名
直接超类的全限定名
这个类型是类类型还是接口类型
这个类型的访问修饰符
任何直接超接口的全限定名的有序列表
该类型的常量池
字段信息
方法信息
除常量外的所有类变量
一个到类ClassLoader的引用
一个到Class类的引用
b、堆
每个java程序都有自己的堆空间,该程序中的所有线程共享堆。
java虚拟机规范并没有规定java对象在堆中是如何表示的,对象的内部表示影响着整个堆和垃圾收集器的设计。
-一种可能的堆空间设计:把堆分为两部分,一是句柄池,一是对象池。句柄池有两部分,指向对象实例变量的指针和指向方法区类型数据的指针。
-另一种设计方式:使对象指针直接指向一组数据,该数据包括对象实例数据以及指向方法区中类数据的指针。
ps:垃圾收集器主要负责自动回收不再被运行的程序引用的对象所占用的内存。
c、java栈
java栈以帧为单位保存线程的运行状态,虚拟机对java栈执行压栈和出栈操作。
当线程调用一个java方法时,虚拟机都会在该线程的java栈中压入一个新帧,在执行这个方法时,使用这个帧来存储参数、局部变量、中间运算结果等。
d、栈帧
栈帧由三部分组成:局部变量区、操作数栈和帧数据区。
-局部变量区是一个以字长为单位,从0开始计数的数组,通过索引来访问。局部变量区包含对象方法的参数和局部变量。
-操作数栈也和局部变量区一样,不同的是不通过索引访问,而是标准的栈操作。 java虚拟机没有寄存器,java虚拟机指令是从操作数栈中取得操作数的。
-帧数据区保存java栈帧所需要的支持常量池解析、正常方法返回和异常派发机制的数据。
e、本地方法栈
任何本地方法接口都会使用本地方法栈,当线程调用的是本地方法时,虚拟机会保持java栈不变,不再在线程的java栈中压入新的帧,虚拟机只是简单的动态连接并直接调用指定的本地方法。
若虚拟机实现的本地方法接口是使用C连接模型的话,那么它的本地方法栈就是C栈;可能本地方法接口需要回调java虚拟机中的java方法,该线程保存本地方法栈的状态并进入另一个java栈。
III、执行引擎
java虚拟机实现的核心都是它的执行引擎,java虚拟机规范中,执行引擎的行为使用指令集来定义,对于每条指令,规范都详细规定了当实现执行到该指令时应该做什么处理。
f、本地方法接口
sun的java本地接口,称作JNI。
分享到:
相关推荐
【标题】"nginx-upstream-jvm-route-1.15" 涉及的核心知识点是Nginx的upstream模块与JVM路由的整合,特别针对Nginx 1.15版本。这个项目旨在解决在配置Nginx时遇到的特定错误提示“nginx: [emerg] invalid parameter ...
《深入JVM---JVM命令---invokespecial》 在Java虚拟机(JVM)的世界里,`invokespecial`指令扮演着至关重要的角色。它主要用于执行对象的构造方法(即`<init>`方法),以及调用私有方法和父类非静态方法。本文将...
**JVM-SANDBOX:基于JVM的实时无侵入AOP框架容器** JVM-SANDBOX是一个强大的工具,它允许开发者在Java虚拟机...无论是用于提高安全性、优化性能,还是简化复杂系统的维护,JVM-SANDBOX都值得开发者深入了解和使用。
虽然`jvm-mon`提供了基本的JVM监控功能,但更复杂的性能问题可能需要结合其他专业工具,如JProfiler、VisualVM、YourKit等,它们提供更深入的分析和故障排查能力,如方法调用时间线、内存分配跟踪、线程栈深度等。...
【标题】"weilei-JVM-ppt.rar"是一个压缩包文件,包含了关于JVM(Java虚拟机)的深入讲解。这个压缩包很可能是由个人精心整理并分享的,用于帮助学习者提升JAVA编程的高级知识,特别是关于JVM的部分。 【描述】提到...
总的来说,"jvm-profiler"是一个强大的工具,它为Java开发者提供了深入洞察JVM内部运作的窗口,有助于我们在开发和维护过程中实现更高效、更稳定的性能。通过理解和利用这个开源项目,我们可以更好地优化我们的...
《深入理解Java虚拟机——JVM-demo探索》 在Java编程世界中,Java虚拟机(JVM)扮演着至关重要的角色。"jvm-demo.zip"这个压缩包文件为我们提供了一个深入学习和实践JVM的平台。它包含了"jvm-demo"这个子文件夹,...
下面我们将深入探讨Python中的Java接口、如何使用Python库与Java集成,以及`jvm-0.4.0b2`可能包含的内容。 首先,Python与Java之间的互操作性主要依赖于Python的Java绑定库,如Jython、Jpype和Py4J。Jython是一种...
1、java虚拟机的基本介绍。 2、字节码的执行 3、常用的jvm参数配置 4、算法和种类 5、gc参数配置 6、类加载器 7、性能监控工具 8、jvm堆栈分析
本文将深入探讨JVM调优的概念、方法以及如何利用"jvm-monitor"进行有效的监控。 一、JVM调优基础 1. 垃圾收集器:JVM的内存管理主要依赖垃圾收集器,不同的收集器有不同的工作策略。例如,新生代的Serial、ParNew...
本资料"jvm-full-gc调优-jvm-full-gc.zip"显然是针对如何减少和优化JVM的Full GC进行深入探讨的。以下将详细介绍JVM Full GC的相关知识点。 1. **理解JVM内存结构**:Java内存主要分为堆内存(Heap)和非堆内存...
《深入探索Java虚拟机:以gp-jvm-visualvm为例》 Java虚拟机(JVM)是Java程序运行的核心,它负责解析字节码、管理内存、执行线程以及优化代码。当我们谈论“gp-jvm-visualvm”时,我们是在讨论一个用于深入理解和...
**JVM沙箱(JVM-Sandbox)是一个用于安全控制Java应用程序执行环境的框架。它允许开发者限制并规范代码在特定环境...通过理解并实践“jvm-sandbox demo”,你可以更深入地掌握这一技术,为你的应用提供额外的安全保障。
项目名为"jvm-rs-main",通过这个项目,我们可以深入学习Rust语言与JVM的交互,以及如何构建一个简化版的JVM。 一、Rust语言的魅力 Rust是一种系统级编程语言,它强调安全、并发和速度。它的内存管理模型避免了空...
【标题】"Jvm调优练习-jvm-tuning.zip" 提供了一个实践 JVM(Java Virtual Machine)调优的机会,这是一项至关重要的技能,特别是在处理大型、高性能的Java应用程序时。JVM调优涉及到调整一系列参数,以优化应用程序...
《深入解析JVM字节码调用图生成器——基于jvm-callgraph开源项目》 在Java虚拟机(JVM)的世界里,理解和优化代码执行性能是至关重要的。为了达到这一目的,开发者需要深入理解程序的运行时行为,其中就包括了类与...
### 深入JVM内核:原理、诊断与优化 #### 一、JVM基础知识 **1.1 JVM概念** Java虚拟机(Java Virtual Machine,简称JVM)是一种用于执行Java字节码的虚拟机。它为Java程序提供了一个运行环境,能够独立于硬件平台...
《深入理解JVM调优:基于jvm-demo1.zip实战解析》 在Java开发中,JVM(Java Virtual Machine)的性能优化是一项至关重要的任务,它直接影响到应用程序的运行效率和稳定性。`jvm-demo1.zip`这个压缩包提供了一些实战...