【JVM】JVM简介|运行流程|内存划分

2024-09-05 20:04

本文主要是介绍【JVM】JVM简介|运行流程|内存划分,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

一、JVM简介

二、JVM运行流程

三、JVM运⾏时数据区(内存划分)

 3.1 堆(线程共享)

3.2 栈

3.3 元数据区(方法区)(线程共享)

3.4 程序计数器(线程私有)


一、JVM简介

JVM是Java Virtua Machine的简称,意为Java虚拟机

虚拟机是指通过软件模拟的具有完整硬件功能的运⾏在⼀个完全隔离的环境中的完整计算机系统

常⻅的虚拟机:JVM、VMwave、Virtual Box

JVM和其他两个虚拟机的区别:

1. VMwave与VirtualBox是通过软件模拟物理CPU的指令集,物理系统中会有很多的寄存器;

2. JVM则是通过软件模拟Java字节码的指令集,JVM中只是主要保留了PC寄存器,其他的寄存器都进⾏了裁剪。

JVM是⼀台被定制过的现实当中不存在的计算机


二、JVM运行流程

程序在执⾏之前先要把java代码转换成字节码(class⽂件),JVM⾸先需要把字节码通过⼀定的⽅式类加载器(ClassLoader)把⽂件加载到内存中运⾏时数据区(Runtime Data Area),⽽字节码⽂件是JVM的⼀套指令集规范,并不能直接交个底层操作系统去执⾏,因此需要特定的命令解析器执⾏引擎(Execution Engine)将字节码翻译成底层系统指令再交由CPU去执⾏,⽽这个过程中需要调⽤其他语⾔的接⼝本地库接⼝(Native Interface)来实现整个程序的功能,这就是这4个主要组成部分的职责与功能

 总结来看,JVM主要通过分为以下4个部分,来执⾏Java程序的,它们分别是: 

1. 类加载器(ClassLoader)

2. 运⾏时数据区(Runtime Data Area)

3. 执⾏引擎(Execution Engine)

4. 本地库接⼝(Native Interface)


三、JVM运⾏时数据区(内存划分)

JVM运⾏时数据区域也叫内存布局,但需要注意的是它和Java内存模型((Java Memory Model,简称JMM)完全不同,属于完全不同的两个概念,它由以下5⼤部分组成:


 3.1 堆(线程共享)

堆的作⽤:整个内存区域中最大的区域,放的就是代码中new出来的对象

我们常⻅的JVM参数设置-Xms10m最⼩启动内存是针对堆的,-Xmx10m最⼤运⾏内存也是针对堆的。

ms是memory start简称,mx是memory max的简称

堆⾥⾯分为两个区域:新⽣代和⽼⽣代,新⽣代放新建的对象,当经过⼀定GC次数之后还存活的对象会放⼊⽼⽣代。新⽣代还有3个区域:⼀个Endn+两个Survivor(S0/S1)

垃圾回收的时候会将Endn中存活的对象放到⼀个未使⽤的Survivor中,并把当前的Endn和正在使⽤的Survivor清楚掉


3.2 栈

(1)Java虚拟机栈(线程私有)

Java虚拟机栈的作⽤:Java虚拟机栈的⽣命周期和线程相同,Java虚拟机栈描述的是Java⽅法执⾏的内存模型:每个⽅法在执⾏的同时都会创建⼀个栈帧(Stack Frame)⽤于存储局部变量表、操作数栈、动态链接、⽅法出⼝等信息。咱们常说的堆内存、栈内存中,栈内存指的就是虚拟机栈

Java虚拟机栈中包含了以下4部分:

1. 局部变量表:存放了编译器可知的各种基本数据类型(8⼤基本数据类型)、对象引⽤。局部变量表所需的内存空间在编译期间完成分配,当进⼊⼀个⽅法时,这个⽅法需要在帧中分配多⼤的局部变量空间是完全确定的,在执⾏期间不会改变局部变量表⼤⼩。简单来说就是存放⽅法参数和局部变量。

2. 操作栈:每个⽅法会⽣成⼀个先进后出的操作栈。

3. 动态链接:指向运⾏时常量池的⽅法引⽤。

4. ⽅法返回地址:PC寄存器的地址

(2)本地⽅法栈(线程私有)

本地⽅法栈和虚拟机栈类似,只不过Java虚拟机栈是给JVM使⽤的,⽽本地⽅法栈是给本地⽅法使⽤的

什么是线程私有?

由于JVM的多线程是通过线程轮流切换并分配处理器执⾏时间的⽅式来实现,因此在任何⼀个确定的时刻,⼀个处理器(多核处理器则指的是⼀个内核)都只会执⾏⼀条线程中的指令。因此为了切换线程后能恢复到正确的执⾏位置,每条线程都需要独⽴的程序计数器,各条线程之间计数器互不影响,独⽴存储。我们就把类似这类区域称之为"线程私有"的内存


3.3 元数据区(方法区)(线程共享)

⽅法区的作⽤:⽤来存储“类对象”,即被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据的

class Test {...
}

Test.class就是类对象,代码中每个类,在jvm上运行都会有对应的类对象 

运⾏时常量池

运⾏时常量池是⽅法区的⼀部分,存放字⾯量与符号引⽤

字⾯量:字符串(JDK8移动到堆中)、final常量、基本数据类型的值

符号引⽤:类和结构的完全限定名、字段的名称和描述符、⽅法的名称和描述符


3.4 程序计数器(线程私有)

程序计数器的作⽤:是内存区域中最小的区域,只需要保存当前要执行的下一条指令(JVM字节码)的地址(这个地址就是元数据区里面的一个地址)


⼩结

上述四个区域中,堆和元数据区,是整个进程只有一份,多个线程共享一份数据

栈和程序计数器,是每个线程都有一份,每个线程的局部变量,则不是共享的,每个线程都是有自己的一份

一个对象在哪个区域,取决于对应变量的形态

1)局部变量:栈上

2)成员变量:堆上

3)静态成员变量:方法区/元数据区 

class Test { int a;Test2 t2 = new Test2();String s = "hello";static int b;
}public static void main() {Test t = new Test();}

 判断:

(1)a在哪个区域?

(2)t2在哪个区域?

(3)s在哪个区域?

(4)b在哪个区域?

(5)t在哪个区域?

答:

(1)(2)a,t2都是Test的成员变量,都是在上的

(3)s也是Test的成员变量,也在堆上的,里面保存的值是一个指向元数据区的地址,“hello”子字符串的本体是在元数据区的

(4)static修饰,成了类属性,就会出现在类对象中,也就在元数据区

(5)t 保存了对象的首地址(堆上的地址),new Test()这个东西才是在堆上的,t是代码中的“局部变量”,所以是在上的(注意t不是对象,只是指向对象的引用

这篇关于【JVM】JVM简介|运行流程|内存划分的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1139928

相关文章

SpringBoot使用Apache Tika检测敏感信息

《SpringBoot使用ApacheTika检测敏感信息》ApacheTika是一个功能强大的内容分析工具,它能够从多种文件格式中提取文本、元数据以及其他结构化信息,下面我们来看看如何使用Ap... 目录Tika 主要特性1. 多格式支持2. 自动文件类型检测3. 文本和元数据提取4. 支持 OCR(光学

Java内存泄漏问题的排查、优化与最佳实践

《Java内存泄漏问题的排查、优化与最佳实践》在Java开发中,内存泄漏是一个常见且令人头疼的问题,内存泄漏指的是程序在运行过程中,已经不再使用的对象没有被及时释放,从而导致内存占用不断增加,最终... 目录引言1. 什么是内存泄漏?常见的内存泄漏情况2. 如何排查 Java 中的内存泄漏?2.1 使用 J

JAVA系统中Spring Boot应用程序的配置文件application.yml使用详解

《JAVA系统中SpringBoot应用程序的配置文件application.yml使用详解》:本文主要介绍JAVA系统中SpringBoot应用程序的配置文件application.yml的... 目录文件路径文件内容解释1. Server 配置2. Spring 配置3. Logging 配置4. Ma

Golang的CSP模型简介(最新推荐)

《Golang的CSP模型简介(最新推荐)》Golang采用了CSP(CommunicatingSequentialProcesses,通信顺序进程)并发模型,通过goroutine和channe... 目录前言一、介绍1. 什么是 CSP 模型2. Goroutine3. Channel4. Channe

Java 字符数组转字符串的常用方法

《Java字符数组转字符串的常用方法》文章总结了在Java中将字符数组转换为字符串的几种常用方法,包括使用String构造函数、String.valueOf()方法、StringBuilder以及A... 目录1. 使用String构造函数1.1 基本转换方法1.2 注意事项2. 使用String.valu

java脚本使用不同版本jdk的说明介绍

《java脚本使用不同版本jdk的说明介绍》本文介绍了在Java中执行JavaScript脚本的几种方式,包括使用ScriptEngine、Nashorn和GraalVM,ScriptEngine适用... 目录Java脚本使用不同版本jdk的说明1.使用ScriptEngine执行javascript2.

Spring MVC如何设置响应

《SpringMVC如何设置响应》本文介绍了如何在Spring框架中设置响应,并通过不同的注解返回静态页面、HTML片段和JSON数据,此外,还讲解了如何设置响应的状态码和Header... 目录1. 返回静态页面1.1 Spring 默认扫描路径1.2 @RestController2. 返回 html2

Spring常见错误之Web嵌套对象校验失效解决办法

《Spring常见错误之Web嵌套对象校验失效解决办法》:本文主要介绍Spring常见错误之Web嵌套对象校验失效解决的相关资料,通过在Phone对象上添加@Valid注解,问题得以解决,需要的朋... 目录问题复现案例解析问题修正总结  问题复现当开发一个学籍管理系统时,我们会提供了一个 API 接口去

Java操作ElasticSearch的实例详解

《Java操作ElasticSearch的实例详解》Elasticsearch是一个分布式的搜索和分析引擎,广泛用于全文搜索、日志分析等场景,本文将介绍如何在Java应用中使用Elastics... 目录简介环境准备1. 安装 Elasticsearch2. 添加依赖连接 Elasticsearch1. 创

Spring核心思想之浅谈IoC容器与依赖倒置(DI)

《Spring核心思想之浅谈IoC容器与依赖倒置(DI)》文章介绍了Spring的IoC和DI机制,以及MyBatis的动态代理,通过注解和反射,Spring能够自动管理对象的创建和依赖注入,而MyB... 目录一、控制反转 IoC二、依赖倒置 DI1. 详细概念2. Spring 中 DI 的实现原理三、