IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> JVM原理 HotSpot内存结构 -> 正文阅读

[Java知识库]JVM原理 HotSpot内存结构

1 简介

JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。

引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。

常见的虚拟机

  • SUN Classic VM: 第一款商用java虚拟机,1996年1月jdk1.0中带的java虚拟机,只能使用纯解释器的方式来执行java代码

  • Exact VM:准确式内存管理,编译器和解释器混合工作以及两级即时编译 ,只在Solaris平台发布

  • HotSport VM: 即时编译,节约了时间和存储,称霸武林。也是目前JDK8.0的默认虚拟机

  • KVM:简单,轻量,高可以执行,主要在手机平台使用

  • JRockit:BEA,世界上最快的java虚拟机,专注服务端应用,oracle收购BEA后,JRockit基本上已经死

  • j9:IBM  Technology for java virtual Machines IT4J

  • dalvik:不能直接指向class文件,寄存器架构,执行dex文件,由class文件转化而来

  • MicrosoftJvm:只能在windows平台运行

JVM 内存模型共分为5个区:

  • 堆(Heap)
  • 方法区(Method Area)
  • 程序计数器(Program Counter Register)
  • 虚拟机栈(VM Stack)
  • 本地方法栈(Native Method Stack)

JVM(hotspot)结构概览如下图所示:

在这里插入图片描述

  • 灰色部分(Java栈,本地方法栈和程序计数器)是线程私有,不存在线程安全问题,橙色部分(方法区和堆)为线程共享区。

2 类加载器

类加载器将class文件字节码内容加载到内存中,并将这些内容转换成方法区中的运行时数据结构。

ClassLoader只负责class文件的加载,至于它是否可以运行,则由执行引擎Execution Engine决定
在这里插入图片描述

类加载器分类

**启动类加载器(BootstrapClassLoader):**也叫根加载器,是虚拟机自带的加载器,用于加载$JAVA_HOME/jre/lib/rt.jar包内的class文件。rt.jar是Java基础类库,包含Java运行环境所需的基础类。

**拓展类加载器(ExtClassLoader):**虚拟机自带的加载器,由Java语言实现,用于加载$JAVA_HOME/jre/lib/ext/.jar目录下的class文件。

应用程序类加载器(AppClassLoader): 虚拟机自带的加载器,用于加载当前应用的classpath的所有类,也就是我们自己写的那些Java代码。

System.out.println(Test.class.getClassLoader());

用户自定义加载器: 通过继承Java.lang.ClassLoader抽象类自定义一个类加载器。


加载器的关系图:

在这里插入图片描述
它们的关系是一种父子关系,通过代码验证:

public class Test {    
    public static void main(String[] args) {        
         Class<Test> testClass = Test.class;        
         System.out.println(testClass.getClassLoader());           
         System.out.println(testClass.getClassLoader().getParent());        
         System.out.println(testClass.getClassLoader().getParent().getParent());   
       }
}

--------------------------
运行结果:
sun.misc.Launcher$AppClassLoader@18b4aac2
sun.misc.Launcher$ExtClassLoader@61bbe9ba
null

加载步骤:

类的加载过程分为三个步骤:

(1)加载(Loading)
通过一个类的全类名获取其二进制字节流,将这个二进制流代表的静态存储结构转化为方法区的运行时数据结构,然后在内存中生成一个代表这个类的java.lang.Class对象,作为方法区中这个类的各种数据的访问入口。

(2) 链接Linking
该过程又可以分为三个阶段:验证Verfication,准备Preparation和解析Resolution)。

  • 验证阶段: 用于确保加载的Class文件的字节流包含的信息是否符合虚拟机要求,保证其正确性合法性
  • 准备阶段: 为类变量(static修饰的变量)分配内存并根据对象类型设置相应的默认初始值(比如int类型为0,Integer类型为null)
    (这里不包含常量,因为常量在编译的时候分配,准备阶段会显示初始化。类的实例变量不会在这个阶段准备初始化。)
  • 解析阶段: 用于将符号引用转换为直接引用。关于符号引用看下示例

实例代码:

public class Test { 
public static void main(String[] args) {
    String str = "hello";
    System.out.println(str);
     }
 }
 

使用 javap -v Test.class 命令查看其字节码:
在这里插入图片描述
可以看到常量池中有许多符号引用(比如#2),解析阶段就是将其解析为直接引用(比如#2表示字符串常量hello)的过程。

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-01-14 01:50:01  更:2022-01-14 01:51:45 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 8:05:26-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码