深入学习java虚拟机||JVM内存结构五大模型

目录

 程序计数器

虚拟机栈

垃圾回收是否涉及栈内存?

栈内存分配越大越好吗?

方法内的局部变量是否线程安全?

栈内存溢出

本地方法栈

 堆

方法区


先看内存图总览

 程序计数器

定义:全称P r o g r a m C o u n t e r R e gis t e r 程 序 计 数 器 ( 寄 存 器 )

作 用 : 是 记 住 下 一 条j v m 指 令 的 执 行 地 址

特点:

        是 线 程 私 有 的

        不 会 存 在 内 存 溢 出(java中唯一一个不会存在内存溢出的区域)

作用:java程序要想执行,首先会编译成字节码,也就是计算机能够看懂的二进制文件,但是呢操作系统并不能认识这些二进制字节码,比如一条命令很有可能产生很多行字节码,这时候就需要程序计数器告诉操作系统,下一句将要执行哪句命令

 0: getstatic     #20                 // PrintStream out = System.out;

 3: astore_1                          // --

 4: aload_1                           // out.println(1);

 5: iconst_1                          // --

 6: invokevirtual #26                 // --

 9: aload_1                           // out.println(2);

10: iconst_2                          // --

11: invokevirtual #26                 // --

14: aload_1                           // out.println(3);

15: iconst_3                          // --

16: invokevirtual #26                 // --

19: aload_1                           // out.println(4);

20: iconst_4                          // --

21: invokevirtual #26                 // --

24: aload_1                           // out.println(5);

25: iconst_5                          // --

26: invokevirtual #26                 // --

在物理上是通过CPU中的寄存器来实现的,寄存器读取速度非常的快

程序计数器还有一个作用:多线程中,如果当前线程的时间片用完了,就需要程序计数器记录当前的线程状态,去执行其他的线程,因此它必须是线程私有的

栈的数据结构特点就好比子弹夹,后放进去的子弹先打出来

栈可以看做为栈帧组成的

栈帧--每个方法运行时需要的内存

虚拟机栈

每个线程运行时所需要的内存,称为虚拟机栈

每个栈由多个栈帧(Frame)组成,对应着每次方法调用时所占用的内存

每个线程只能有一个活动栈帧,对应着当前正在执行的那个方法

垃圾回收是否涉及栈内存?

并不涉及,方法执行完就会出栈,销毁栈帧

栈内存分配越大越好吗?

并不是,一般采用默认的分配空间

方法内的局部变量是否线程安全?

如果方法内局部变量没有逃离方法的作用访问,它是线程安全的

如果是局部变量引用了对象,并逃离方法的作用范围,需要考虑线程安全

栈内存溢出

栈帧过多导致栈内存溢出(比如死循环)

栈帧过大导致栈内存溢出(一般不会出现,栈帧一般存着方法变量和局部参数,一个int类型才占用4bite)

本地方法栈

给本地方法运行提供一个内存区 

这个部位存的是非java部分的代码,有时候不能够直接去和操作系统打交道,底层可能要用到本地方法(可能用c或者C++写的)去调用,这些本地方法就存在本地方法栈

 堆

 :通过 new 关键字,创建对象都会使用堆内存

特点:

它是线程共享的,堆中对象都需要考虑线程安全的问题

有垃圾回收机制

方法区

存的是和类有关的信息,也存在类加载器(加载二进制字节码)

方法区也会内存溢出

 方法区的实现:

在1.8之前是采用的永久代的形式,并且字符串常量池也在方法区

在1.8之后就采用了元空间的形式,字符串常量池被移到了堆中,默认使用的是系统内存的空间,一般不会导致内存溢出,但是理论上是可以的,加载的类过多就会出现溢出

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Pytorch个人学习记录总结 06

目录 神经网络-卷积层 torch.nn.Conv2d 神经网络-最大池化的使用 torch.nn.MaxPool2d 神经网络-卷积层 torch.nn.Conv2d torch.nn.Conv2d的官方文档地址 CLASS torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride1, padding0, dilation1, groups1, biasTrue,…

探秘MySQL底层架构:设计与实现流 程一览

点赞还是要求一下的,万一屏幕前的大漂亮,还有大帅哥就点赞了呢!!!! Author: 源码时代 Raymon老师 说在前头 Mysql,作为一款优秀而广泛使用的数据库管理系统,对于众多Java工程师来…

发布npm包流程

发布npm包的步骤如下: 在终端中通过 npm init 命令创建一个新的npm包,按照提示填写包的信息,如包名称、版本、描述、作者、许可证等。 在包的根目录下创建一个 index.js 文件,编写你的代码。 确认你已经注册了npm账号&#xff0…

自动驾驶感知系统-超声波雷达

超声波雷达,是通过发射并接收40kHz的超声波,根据时间差算出障碍物距离。其测距精度是1~3cm.常见的超声波雷达有两种:第一种是安装在汽车前后保险杠上的,用于测量汽车前后障碍物的驻车雷达或倒车雷达,称为超声波驻车辅助…

re学习(25)i春秋-re-basebasebase(base64+函数构造)

参考文章:re学习笔记(22)爱春秋CTF答题夺旗赛(第四季)-re-basebasebase_ctfbase~base_Forgo7ten的博客-CSDN博 总结:1.flag——→base64加密(自定义)——→与3异或——→加密后数据…

刘铁猛C#语言教程——语句1

语句的定义 以下是对该文档的翻译 一条语句对应着一条汇编语言指令或者一条语句对应着一系列有着内在逻辑关联的汇编指令,对于这句话的理解,我们可以观察C#编译器编译的C#程序后得到的汇编语言代码,这样便可以看到语句与指令的关系&#xff…

在Chrome(谷歌浏览器)中安装Vue.js devtools开发者工具及解决Vue.js not detected报错

文章目录 一、Vue.js devtools开发者工具安装1.打开谷歌浏览器——点击扩展程序——选择管理扩展程序2.先下载添加一个谷歌助手到扩展程序中(根据提示进行永久激活)3.点击谷歌浏览器的应用商店4.输入Vue.js devtools——搜索——选择下载 二、解决Vue.js…

【玩转Linux】标准IO函数

(꒪ꇴ꒪ ),hello我是祐言博客主页:C语言基础,Linux基础,软件配置领域博主🌍快上🚘,一起学习!送给读者的一句鸡汤🤔:集中起来的意志可以击穿顽石!作者水平很有限,如果发现错误&#x…

华为数通HCIP-OSPF路由计算

路由协议 作用:用于路由设备学习非直连路由; 动态路由协议:使路由设备自动学习到非直连路由; 分类: 按照算法分类: 1、距离矢量路由协议;(RIP、BGP) 只交互路由信息…

什么是Redis?

什么是Redis 什么是Redis一、特性1. 支持多种数据结构2. 读/写速度快,性能高。3. 支持持久化。4. 实现高可用主从复制,主节点做数据副本。5. 实现分布式集群和高可用。 二、基本数据类型string(字符串)list(双向链表)set(集合)zse…

PostgreSQL数据库动态共享内存管理器——Dynamic shared memory areas

dsm.c提供的功能允许创建后端进程间共享的共享内存段。DSA利用多个DSM段提供共享内存heap;DSA可以利用已经存在的共享内存(DSM段)也可以创建额外的DSM段。和系统heap使用指针不同的是,DSA提供伪指针,可以转换为backend…

Java的第十三篇文章——JAVA多线程

目录 学习目标 1. 线程的基本概念 1.1 进程 1.2 线程 2. Java实现线程程序 2.1 java.lang.Thread类 2.2 线程的内存图 2.3 Thread类的方法 3. Java实现线程程序 3.1 java.lang.Runnable接口 3.2 实现接口的好处 4. 线程安全 4.1 售票例子 4.2 同步代码块 4.3 同…

为什么视频画质会变差,如何提升视频画质清晰度。

在数字时代,视频已经成为我们生活中不可或缺的一部分。然而,随着视频的传输和处理过程中的多次压缩,画质损失逐渐凸显,影响了我们对影像的真实感受。为了让视频画质更加清晰、逼真,我们需要采取一些措施来保护和修复视…

物联网网关模块可以带几台plc设备吗?可以接几个modbus设备?

随着物联网技术的快速发展,物联网网关模块已经成为了实现物联网应用的重要工具。很多客户在选择物联网网关模块时想了解物联网网关模块的设备接入能力,一个物联网网关模块可以带几台PLC设备?可以接几个Modbus设备? 物联网网关模块…

基于Jquery EasyUI JSZip FileSaver的简单使用

一、前言 在前端的项目开发中 &#xff0c;下载文件压缩包是很重要的一个环节&#xff0c;那么怎么下载多个文件并压缩成ZIP下载呢&#xff1f; 二、使用步骤 1、引用库 <script type"text/javascript" src"~/Scripts/comm/jszip.min.js" ></…

【设计模式——学习笔记】23种设计模式——适配器模式Adapter(原理讲解+应用场景介绍+案例介绍+Java代码实现)

介绍 生活中的案例 不同国家的插座不同&#xff0c;出国旅游充电器不能直接使用&#xff0c;可以通过使用多功能转换插头来辅助使用 基础介绍 适配器模式将某个类的接口转换成客户端期望的另一个接口表示&#xff0c;主的目的是兼容性&#xff0c;让原本因接口不匹配不能一起…

JVM理论(六)执行引擎--垃圾回收

概述 垃圾: 指的是在运行程序中没有任何指针指向的对象垃圾回收目的: 为了及时清理空间使得程序可以正常运行垃圾回收机制: JVM采取的是自动内存管理,即JVM负责对象的创建以及回收,将程序员从繁重的内存管理释放出来,更加专注业务的开发垃圾回收区域: 频繁收集Young区(新生代)…

【面试】 redis击穿现象?如何防止击穿?

文章目录 背景击穿案例解决方案:通过synchronized双重检查机制&#xff1a;某个key只让一个线程查询&#xff0c;阻塞其它线程设置value永不过期&#xff08;设置热点数据永不过期&#xff09;使用互斥锁(mutex key) 背景 大家都知道,计算机的瓶颈之一就是IO,为了解决内存与磁…

【深度学习】yolov 图片训练的时候的遇到的warning: corrupt JPEG restored and saved

报错原因 是图片在dataset.py 走验证时报的错误。 if im.format.lower() in (jpg, jpeg):with open(im_file, rb) as f:f.seek(-2, 2)if f.read() ! b\xff\xd9: # corrupt JPEGImageOps.exif_transpose(Image.open(im_file)).save(im_file, JPEG, subsampling0, quality100)m…

数据结构——顺序表

即使你内心没有一尊明月&#xff0c;也要给自己留下一方皎洁 文章目录 什么是顺序表 顺序表的实现 顺序表内部基础设置 结构体数据类型重定义 顺序表结构定义 顺序表空间初始化及扩容设置 顺序表空间的初始化及销毁 顺序表的扩容 顺序表基本功能 尾插尾删 头插头删…