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

news2024/11/13 21:40:23

目录

一、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不是对象,只是指向对象的引用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2108043.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【学习笔记】5G-A时代物联网应用及策略研究

摘要 海量物联网通信是5G典型应用场景之一,为了实现蜂窝网的全场景物联能力,需要更多的场景化技术,5G-A引入了RedCap(5G Reduced Capability)和Passive IoT。其中,RedCap降低了设备复杂性及成本&#xff0…

js混淆保护在线工具开源项目大全

具体前往:js代码混淆加密保护工具&开源项目大全

指针复习--(笔记整理)

之前出的有指针合集在博客,最近要备考计算机二级,所以复习了一下,有一些容易遗忘的点整理了一下,大家可以有针对性的看一看,后续刷二级真题的时候也会进行题目代练,可以下收藏起来。记得先赞,祝…

力扣96-不同的二叉搜索树(Java详细题解)

题目链接:96. 不同的二叉搜索树 - 力扣(LeetCode) 前情提要: 因为本人最近都来刷dp类的题目所以该题就默认用dp方法来做。 dp五部曲。 1.确定dp数组和i下标的含义。 2.确定递推公式。 3.dp初始化。 4.确定dp的遍历顺序。 …

高并发内存池(一):项目介绍与定长内存池的实现

目录​​​​​​​ 项目介绍 池化技术 内存池 内存碎片 malloc工作原理 定长内存池 申请内存 释放内存 定位new VirtualAlloc函数 封装VirtualAlloc 定长内存池的最终代码 项目介绍 项目原型:goole的开源项目tcmalloc(Thread-Caching Mal…

一种极简的余弦定理证明方法

余弦定理的证明方法有很多种,这里介绍一种极简的证明方法。该方法是本人在工作中推导公式,无意中发现的。证明非常简单,下面简单做下记录。   如上图为任意三角形ABC,以点C为原点,建立直角坐标系(x轴方向…

【网络编程通关之路】 Udp 基础回显服务器(Java实现)及你不知道知识原理详解 ! ! !

本篇会加入个人的所谓鱼式疯言 ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. 🤭🤭🤭可能说的不是那么严谨.但小编初心是能让更多人…

vue3中ref自动解包

1.模板中使用 ref 类型的数据&#xff0c;会自动解包&#xff0c;注意需要是顶级的ref <template> <!-- 自动解包--><div>{{ name }}</div> </template><script setup> import { ref} from vue const name ref(hello) </script>下…

com.alibaba.fastjson.JSONArray循环引用导致{“$ref“:“$[0]“}

发一个库存~ 在for循环中将对象add到.JSONArray中&#xff0c;arr.toJSONString()&#xff0c;输出的结果如下&#xff1a; [{"sex":"男","age":"10","name":"张三"},{"$ref":"$[0]"},{&quo…

Java synchronized 原理

Synchronized使用 synchronized关键字可使用在方法上或代码块上表示一段同步代码块&#xff1a; public class SyncTest {public void syncBlock(){synchronized (this){System.out.println("hello block");}}public synchronized void syncMethod(){System.out.pr…

小白入门LLM大模型最牛X教程------上交《动手学大模型应用开发》!

本项目是一个面向小白开发者的大模型应用开发教程&#xff0c;旨在结合个人知识库助手项目&#xff0c;通过一个课程完成大模型开发的重点入门&#xff0c;涵盖了大模型应用开发的方方面面&#xff0c;主要包括&#xff1a; 教程一共有七章内容&#xff1a; 《动手学大模型》…

13.5 告警静默

本节重点介绍 : 静默应用场景页面创建api接口创建查看 静默 作用 先告警后静默&#xff1a;持续发送的告警停止发送先配置静默&#xff1a;上线或者运维操作会导致触发一大波告警&#xff0c;提前创建静默消息。防止告警风暴 静默接口 /api/v2/silences 调用静默的代码 …

Leetcode8.字符串转换整数 -codetop

代码&#xff08;首刷看解析 2024年9月5日&#xff09; class Solution { public:int myAtoi(string str) {unsigned long len str.length();// 去除前导空格int index 0;while (index < len) {if (str[index] ! ) {break;}index;}if (index len) {return 0;}int sign …

idea插件开发之bean复制插件

背景 周末在家无事做&#xff0c;顺手开发了一个之前一直想要做的插件&#xff0c;那就是bean复制插件。 在项目中&#xff0c;由于代码分层设计&#xff0c;对于同样一个数据我们通常会定义不同层的实体&#xff0c;例如xxxEntity、xxxDTO、xxxVO等&#xff0c;这些不同的实…

echarts地图绘制并实现下钻功能

本文参考网址 使用echarts地图需要先准备好echarts地图渲染需要的json数据&#xff0c;数据可以从阿里云地址中下载自己需要的&#xff0c;下载之后直接引入即可使用&#xff0c;本文针对全国地图做一个简单的demo 阿里云界面如图 // 1、准备echarts地图容器<div class&…

如何借助AI快速筛选和整理文献?

AIPaperGPT&#xff0c;论文写作神器~ https://www.aipapergpt.com/ 在撰写毕业论文时&#xff0c;文献综述是必不可少的部分。它不仅为你的研究提供理论背景&#xff0c;还展示了你对研究领域的深入理解。然而&#xff0c;文献综述的撰写过程常常让学生感到头疼&#xff0c;…

基于JAVA+SpringBoot+Vue的大学校园回忆录系统

基于JAVASpringBootVue的大学校园回忆录系统 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末附源码下载链接&#x1f345; …

ElasticSearch-聚合操作

聚合的分类 aggsMetric Aggregation min, max, avg, sumstats, cardinality Bucket Aggregation terms ordertext -> fielddatarangehistogramtop_hits Pipeline Aggregation min_bucketstats_bucketpercentiles_bucketcumulative_sum 聚合的作用范围 Filter, Post Filter,…

5.1.数据结构-c/c++二叉树详解(上篇)(遍历,几种二叉树)

本章所有代码请见&#xff1a;5.3.数据结构-c/c二叉树代码-CSDN博客 目录 一. 二叉树的基本介绍 1.2 满二叉树 1.3 完全二叉树 1.4 搜索二叉树 1.5 平衡二叉搜索树 二. 二叉树的常用操作 2.1 二叉树的定义 2.2 创建一个新的节点 2.3 构建一颗树 2.5 销毁一棵树 三.…

One-Shot Imitation Learning with Invariance Matching for Robotic Manipulation

发表时间&#xff1a;5 Jun 2024 论文链接&#xff1a;https://readpaper.com/pdf-annotate/note?pdfId2408639872513958656&noteId2408640378699078912 作者单位&#xff1a;Rutgers University Motivation&#xff1a;学习一个通用的policy&#xff0c;可以执行一组不…