`

java虚拟机

    博客分类:
  • jvm
 
阅读更多

一、java虚拟机生命周期结束情况
1、程序正常结束
2、System.exit
3、程序异常结束
4、操作系统异常导致虚拟机结束
二、类的加载、连接与初始化
1、加载:查找并加载类的二进制数据

1)将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区中,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构。

2)加载.class文件的方式,从本地系统中直接加载、通过网络下载、从zip和jar等归档文件中加载、从专有数据库中提取、将java原文件动态编译为.class文件

3)类加载器

虚拟机自带的加载器:根类加载器、扩展类加载器、系统类加载器

用户自定义的类加载器:都是java.lang.ClassLoader的子类

4)JVM规范允许类加载器在预料到某个类将要被使用时就预先加载它,如果在预先加载的过程中遇到了class文件缺失,或错误,类加载器必须在程序首次主动使用该类时才报告错误,若这个类一直没有被程序主动使用,那么类加载器就不会报告错误。

2、连接:

将已经读入到内存的类的二进制数据合并到虚拟机的运行时环境中去。
1)验证:确保被加载的类的正确性

类文件结构检查:确保类文件遵从java类文件的固定格式

语义检查:确保类本身符合java语言的语法规定,比如验证final类型的类没有子类等

字节码验证:确保字节码流可以被虚拟机安全执行,字节码流代表java方法,它是由被称作操作码的单字节指令组成的序列,每一个操作码后都跟着一个或多个操作数,字节码验证步骤会检查每个操作码是否合法,即是否有合法的操作数。

二进制兼容型验证:确保相互引用的类之间协调一致,例如在Worker类的gotoWork方法中会调用Car类的run方法,Java虚拟机在验证Worker类时,会检查在方法区内是否存在Car类的run方法,若不存在,会抛出NoSuchMethodError错误
2)准备:为类的静态变量分配内存,并将其初始化为默认值
3)解析:把类的符号引用转换为直接引用

例如,在Worker类的gotoWork方法中会引用Car类的run方法,在Worker类的二进制数据中,包含了一个对Car类的run方法的符号引用,它由run方法的全名和相关描述符组成,在解析阶段,虚拟机会把这个符号引用替换为一个指针,该指针指向Car类的run方法在方法区中的内存地址,这个指针就是直接引用。
3、初始化:为类的静态变量赋予正确的初始值

在程序中,静态变量的初始化有两种途径,一种是在静态变量的声明处进行初始化,另一种是在静态代码块中进行初始化,

三、主动使用和被动使用

1、主动使用(6种情况)

1)创建类的实例

2)访问某个类或接口的静态变量,或者对该静态变量赋值

3)调用类的静态方法

4)反射

5)初始化一个类的子类

6)java虚拟机启动时被标明为启动类的类
注意:此时还没有对象生成,所有java虚拟机实现必须在每个类或接口被java程序首次主动使用时才初始化他们,除了以上六种情况,其他使用java类的方式都被看作是对类的被动使用,都不会导致类的初始化。

四、java内存区域和内存溢出

1、运行时数据区

1)程序计数器:可以看做当前线程执行的字节码的行号指示器(它的值是虚拟机字节码指令地址),线程私有的内存,它是虚拟机规范中唯一规定的不会抛出OutOfMemoryError的区域。

2)虚拟机栈:也是线程私有的内存区域,描述的是方法执行的内存模型,方法被执行时会创建一个栈帧用来存储局部变量表、操作数栈等信息。

局部变量表:存放了编译时可知的基本数据类型、对象引用和返回地址类型,其中long和double占用2个局部变量空间,其余占用1个空间,在编译时局部变量表所需的内存空间就完成分配,运行时不会改变它的大小。虚拟机规范中,当线程请求的栈深度大于虚拟机允许的深度,抛出StackOverflowError,当无法申请到足够的内存时抛出OutOfMemoryError。

3)本地方法区

4)堆,虚拟机进程启动时创建,线程共享,当无法申请足够内存时,会抛出OutOfMemoryError

5)方法区,线程共享,用来存储虚拟机加载的类信息、常量、静态变量、即时编译后的代码等数据,会抛出OutOfMemoryError

6)运行时常量池,方法区的一部分,用来存放编译器的字面量和符号引用,它也具有动态性,运行时可以将新的常量放入池中,当无法再申请到内存时会抛出OutOfMemoryError

7)直接内存,并不是虚拟机运行时数据区的一部分,可以使用native函数库直接分配堆外内存,然后通过一个存储在java堆中的DirectByteBuffer对象的作为这块内存的引用进行操作,在一些场景中能显著提升性能,因为它避免了在java堆和native中来回复制数据。它会受本机总内存的大小及处理器寻址空间的限制,当直接内存+虚拟机内存的总和大于物理内存,导致动态扩展时出现OutOfMemoryError异常。

 

  • 大小: 125.9 KB
分享到:
评论

相关推荐

    深入java虚拟机.pdf

    深入 Java 虚拟机.pdf Java 虚拟机(Java Virtual Machine,JVM)是 Java 语言的 runtime 环境,是 Java 程序执行的核心组件。它提供了一个平台无关的环境,允许 Java 程序在不同的操作系统和硬件平台上运行。 一...

    Java虚拟机规范.Java SE 8版.zip

    《Java核心技术系列:Java虚拟机规范(Java SE 8版)》由Oracle官方发布,Java虚拟机技术创建人撰写,国内资深Java技术专家翻译。书中基于全新Java SE 8,完整且准确地阐述Java虚拟机规范,是深度了解Java虚拟机和...

    Java虚拟机规范 Java SE 8版-带目录-pdf

    Java虚拟机规范 Java SE 8版-带目录-pdf,本书完整而准确地阐释了Java虚拟机各方面的细节,围绕Java虚拟机整体架构、编译器、class文件格式、加载、链接与初始化、指令集等核心主题对Java虚拟机进行全面而深入的分析...

    java虚拟机规范高清中文版本(java SE 8版本)

    第1章 :简单地介绍了Java虚拟机的历史并吹捧了←_← 一下Java的平台无关性(一次编译,到处运行); 第2章:概览Java虚拟机整体架构; 第3章:介绍如何将Java语言编写的程序转换为虚拟机指令集; 第4章:定义...

    自己动手写Java虚拟机 (Java核心技术系列)@

    本书摒弃了传统的以解读枯燥的Java虚拟机规范文档和分析繁琐的Java虚拟机源代码的方式来讲解Java虚拟机,取而代之的是,以实践的方式,引导读者如何从零开始构建和实现一个Java虚拟机,整个过程不仅能让读者做到对...

    Java虚拟机规范中文版(JavaSE7).pdf

    Java虚拟机(JVM)是Java编程语言的核心组成部分,它是一种抽象的计算设备,能够运行Java字节码。Java虚拟机规范(Java SE 7版)是定义JVM行为的官方文档,确保所有Java平台的实现遵循相同的规则,以提供跨平台的...

    Java虚拟机规范 JavaSE7

    Java虚拟机(JVM)是Java程序运行的基础,它负责执行Java字节码,提供了一个与平台无关的执行环境。JVM规范定义了JVM的结构、指令集和运行时数据区,以及如何执行指令和处理异常。自1999年以来,JVM规范经历了多次...

    Java虚拟机规范(中文版).pdf

    ### Java虚拟机规范(JVM)概览 #### 核心概念与重要性 《Java虚拟机规范(JavaSE7版)》是理解Java虚拟机(JVM)运作机制的基石,由Tim Lindholm、Frank Yellin、Gilad Bracha和Alex Buckley等人撰写,后由周志明、...

    Java虚拟机规范中文版.pdf

    Java虚拟机(JVM)是实现Java技术的关键组件,它为Java程序提供了一个运行环境。Java程序在编写后会被编译成一种称为字节码的中间表示形式,这种字节码可以跨平台运行,因为JVM负责将字节码转换成机器代码。JVM的...

    深入Java虚拟机(原书第2版).pdf【附光盘内容】

    《深入Java虚拟机(原书第2版)》,原书名《Inside the Java Virtual Machine,Second Edition》,作者:【美】Bill Venners,翻译:曹晓钢、蒋靖,出版社:机械工业出版社,ISBN:7111128052,出版日期:2003 年 9 ...

    Java虚拟机(Java VM) msjavax86 微软java虚拟机

    Java虚拟机(Java Virtual Machine,简称JVM)是Java编程语言的核心组成部分,它是一个用于执行Java字节码的软件或硬件设备。Java程序在编译时并不直接转化为机器语言,而是转化为中间代码,即字节码。JVM的作用就是...

    java虚拟机各种版本

    Java虚拟机(JVM)是Java编程语言的核心组成部分,它为Java程序提供了跨平台的运行环境。Java程序在编写完成后,会被编译成字节码(.class文件),这些字节码可以在任何装有JVM的系统上运行,实现了“一次编写,到处...

    java虚拟机规范(java SE7)

    java虚拟机规范,高清PDF版本,含有目录结构:第一章:引言; 第二章:java虚拟结构(运行时区域内存:寄存器,java虚拟机栈,java堆,方法去,运行时常量池,本地方法栈); 第三章:为java虚拟机编译; 第四章:...

    实战Java虚拟机——JVM故障诊断与性能优化 pdf

    《实战Java虚拟机——JVM故障诊断与性能优化》内容简介:随着越来越多的第三方语言(Groovy、Scala、JRuby等)在Java虚拟机上运行,Java也俨然成为一个充满活力的生态圈。本书将通过200余示例详细介绍Java虚拟机中的...

    MiniJavaVM—个Java虚拟机的设计和实现

    MiniJavaVM—个Java虚拟机的设计和实现 在本篇文章中,我们将详细介绍 MiniJavaVM 的设计和实现,包括其总体架构、功能、运行环境和开发工具,以及具体的实现步骤。 第一章绪论 Java 虚拟机(Java Virtual ...

    深入java虚拟机 高清pdf 高清高清高清

    《深入Java虚拟机》这本书是Java开发者深入了解JVM(Java Virtual Machine)的必备经典之作。它详尽地探讨了Java虚拟机的工作原理、内存管理、类加载机制、字节码执行以及性能优化等多个核心主题,旨在帮助开发者...

Global site tag (gtag.js) - Google Analytics