0
点赞
收藏
分享

微信扫一扫

Python【寻找重复的数字】

i奇异 2023-12-02 阅读 44

目录

一、JVM基本介绍

二、JVM内存模型

2.0 概述

2.1 类加载子系统

2.2 运行时数据区

2.2.0 基本介绍

2.2.1 本地方法栈:由C语言实现

2.2.2 Java方法栈(虚拟机栈)

2.2.3 方法区

2.2.3.1 基本概念 

2.2.3.2 实现方式:永久代和元空间

2.2.3.3 组成元素:类常量池、运行时常量池、字符串常量池

2.2.4 堆

2.2.5 程序计数器(PC寄存器)

2.3 执行引擎


 

一、JVM基本介绍

我们经常说Java是一个跨平台的语言,因为它是运行在Java虚拟机上(JVM)的。

在Java程序的实际编译、运行过程中,编译器将Java源代码编译成字节码文件后,JVM将字节码翻译成特定平台的机器码运行程序。

实际上,Java是跨平台的,JVM不是跨平台的,我们在Linux、windows等系统中安装对应版本的JVM后,同一个Java代码在这些JVM上运行,从而起到跨平台的效果。

二、JVM内存模型

2.0 概述

JVM由三大部分组成:类加载子系统、运行时数据区、执行引擎。

2.1 类加载子系统

类加载子系统:通过类加载机制加载类的class文件,如果该类是第一次加载,会执行加载、验证、解析。只负责class文件的加载,至于是否可运行,则由执行引擎决定。

JVM中,类加载过程是在类加载子系统完成的。

类加载过程:加载 --> 链接(验证 --> 准备 --> 解析) --> 初始化

2.2 运行时数据区

2.2.0 基本介绍

运行时数据区:在程序运行时,存储程序的内容(例如字节码、对象、参数、返回值等)。

运行时数据区包括本地方法栈、虚拟机栈、方法区、堆、程序计数器。

在运行时数据区中,只有方法区和堆是各线程共享的进程内存区域,其他运行区都是每个线程可以独立拥有的。

图示:

2.2.1 本地方法栈:由C语言实现

本地方法栈:存放本地方法调用过程中的栈帧。

本地方法栈用于管理本地方法的调用,本地方法是C语言写的被编译为基于本机硬件和操作系统的程序。

栈帧:栈帧是栈的元素,由三部分组成,即局部变量表(存方法参数和局部变量)、操作数栈(存方法执行过程中的中间结果,或者其他暂存数据)和帧数据区(存方法返回地址、线程引用等附加信息)。

2.2.2 Java方法栈(虚拟机栈)

存放Java方法调用过程中的栈帧。用于管理Java方法的调用。

Java方法是我们开发时写的Java方法

2.2.3 方法区

2.2.3.1 基本概念 

方法区:可以看作是一块独立于Java堆的内存空间,方法区是各线程共享的内存区域。

2.2.3.2 实现方式:永久代和元空间

方法区有两种实现方式,分别是:永久代和元空间。

永久代:属于JVM方法区的内存,用来存储类的元数据,如类名、方法信息、字段信息等一些静态的数据。

永久代的特点:

  • JDK7及之前方法区也叫永久代。
  • 永久代的缺点是内存大小固定,容易出现oom问题。
  • 可以通过-XX:PermSize设置永久代大小。永久代对象只能通过Major GC(又称Full GC)进行垃圾回收。

元空间:是Hotspot在JDK8引入的,用于取代永久代。

元空间属于本地内存,由操作系统直接管理,不再受JVM管理。

同时内存空间可以自动扩容,避免内存溢出。默认情况下元空间可以无限使用本地内存,也可以通过-XX:MetaspaceSize限制内存大小。

方法区和永久代、元空间的关系:方法区是一个抽象概念,永久代和元空间是方法区的实现方式。

2.2.3.3 组成元素:类常量池、运行时常量池、字符串常量池

常量池:就是一张表,JVM根据这张常量表找到要执行的类信息和方法信息

  • 类常量池:是.class字节码文件中的资源仓库,主要存放字面量(表示字符串值和数值,例如字符串值"abc"、final常量、静态变量)和符号引用(类和接口的全限定名、字段名、方法名)。
  • 运行时常量池:类加载的“加载”阶段会创建运行时常量池,统一存放各个类常量池去重后的符号引用。在类加载的“解析”阶段JVM会把运行时常量池的这些符号引用转为直接引用。类常量池。类常量池在字节码文件中的,运行时常量池在内存中。
  • 字符串常量池:专门针对String类型设计的常量池。是当前应用程序里所有线程共享的,每个jvm只有一个字符串常量池。存储字符串对象的引用。在创建String对象时,JVM会先在字符串常量池寻找是否已存在相同字符串的引用,如果有的话就直接返回引用,没的话就在堆中创建一个对象,然后常量池保存这个引用并返回引用。

2.2.4 堆

堆:存放对象实例、实例变量、数组,包括新生代(伊甸园区、幸存区S0和S1)和老年代。

堆是垃圾收集器管理的内存区域。

堆解决的是数据存储的问题,即数据怎么放、放在哪儿。堆实际内存空间可以不连续,大小可以选择固定大小或可扩展,堆是各线程共享的内存区域。

2.2.5 程序计数器(PC寄存器)

程序计数器(PC寄存器):存放下一条字节码指令的地址,由执行引擎读取下一条字节码指令并转为本地机器指令进行执行。是程序控制流(分支、循环、跳转、线程恢复)的指示器,只有它不会抛出OutOfMemoryError。每个线程有自己独立的程序计数器,以便于线程在切换回来时能知道下一条指令是什么。程序计数器生命周期与线程一致。

2.3 执行引擎

执行引擎:将字节码指令解释/编译为对应平台上的本地机器指令。充当了将高级语言翻译为机器语言的译者。

执行引擎在执行过程中需要执行什么样的字节码指令依赖于PC寄存器。每当执行完一项指令操作后,PC寄存器就会更新下一条需要被执行的指令地址。

指令可以分为字节码指令和本地机器指令。

  • 字节码指令(JVM指令):字节码文件中的指令,内部只包含一些能够被JVM所识别的字节码指令、符号表,以及其他辅助信息,不能够直接运行在操作系统之上。
  • 本地机器指令:可以直接运行在操作系统之上。

 

举报

相关推荐

0 条评论