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

news2024/11/24 7:35:53

目录

 程序计数器

虚拟机栈

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

栈内存分配越大越好吗?

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

栈内存溢出

本地方法栈

 堆

方法区


先看内存图总览

 程序计数器

定义:全称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之后就采用了元空间的形式,字符串常量池被移到了堆中,默认使用的是系统内存的空间,一般不会导致内存溢出,但是理论上是可以的,加载的类过多就会出现溢出

 

 

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

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

相关文章

【算法与数据结构】226、LeetCode翻转二叉树

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析:这道题的思路很简单,本质上就是遍历每一个节点,然后交换左右节点。我们可以用前…

吃透《西瓜书》第一章绪论、第二章模型评估

目录 第一章 绪论 1.1 引言 1.2 基本术语 1.3 假设空间 第二章 模型评估 2.1 为什么需要模型评估? 2.2 模型评估的定义 2.2.1 评估方法之留出法: 2.2.2 交叉验证法和自助法 2.3 深入理解模型评估 第一章 绪论 1.1 引言 机器学习是什么? 机器…

Java网络编程(二)流

网络程序所做的很大一部分工作都是简单的输入和输出:将数据字节从一个系统移动到另一个系统。字节就是字节。在很大程度上讲,读取服务器发送给你的数据与读取文件并没什么不同。向客户端发送文本与写文件也没有什么不同。但是,Java中输入和输出(I/O)的组…

【node.js】04-模块化

目录 一、什么是模块化 二、node.js中的模块化 1. node.js中模块的分类 2. 加载模块 3. node.js 中的模块作用域 4. 向外共享模块作用域中的成员 4.1 module对象 4.2 module.exports 对象 4.3 exports对象 5. node.js 中的模块化规范 一、什么是模块化 模块化是指解…

Grafana - TDEngine搭建数据监测报警系统

TDengine 与开源数据可视化系统 Grafana 快速集成搭建数据监测报警系统 一、介绍二、前置条件三、Grafana 安装及配置3.1 下载3.2 安装3.2.1 windows安装 - 图形界面3.2.2 linux安装 - 安装脚本 四、Grafana的TDEngine配置及使用4.1 登录4.2 安装 Grafana Plugin 并配置数据源4…

安卓版本的发展4-13

Android 4.4 KitKat 1、通过主机卡模拟实现新的 NFC 功能。 2、低功耗传感器,传感器批处理,步测器和计步器。 3、全屏沉浸模式,隐藏所有系统 UI,例如状态栏和导航栏。它适用于鲜艳的视觉内容,例如照片、视频、地图、…

结构型设计模式之装饰器模式【设计模式系列】

系列文章目录 C技能系列 Linux通信架构系列 C高性能优化编程系列 深入理解软件架构设计系列 高级C并发线程编程 设计模式系列 期待你的关注哦!!! 现在的一切都是为将来的梦想编织翅膀,让梦想在现实中展翅高飞。 Now everythi…

上海科技大学智能生活组齐聚合合信息,“沉浸式”体验人工智能产品

近期,上海科技大学组织本科生产业实践-校企联合人才培养活动,30余名学生组成的“智能生活组”实地参访人工智能及大数据科技企业上海合合信息科技股份有限公司(简称“合合信息”)。本次活动旨在通过项目体验、主题交流&#xff0c…

2023-7-24-第二十二式备忘录模式

🍿*★,*:.☆( ̄▽ ̄)/$:*.★* 🍿 💥💥💥欢迎来到🤞汤姆🤞的csdn博文💥💥💥 💟💟喜欢的朋友可以关注一下&#xf…

VS Code 设置大小写转换快捷键

VS Code 设置大小写转换快捷键 前言:VS Code 没有默认的大小写转换快捷键,需要我们自己添加。 一 、打开快捷键设置面板 二、添加快捷键 在搜索框输入 “转换为大写”,如果您的VS Code没有汉化,此处输入“Transform to Uppercase…

vmware平台上虚拟机无法查看到WWID

需要在虚拟机中部署rac测试环境,创建虚拟机后无法查看到wwid [rootdb1 ~]# for i in cat /proc/partitions |awk {print $4} |grep sd; do echo "Device: $i WWID: /usr/lib/udev/scsi_id --page0x83 --whitelisted --device/dev/$i "; done |sort -k4 De…

Bootstrap每天必学之面板

Bootstrap每天必学之面板 1、面板 面板(Panels)是Bootstrap框http://架新增的一个组件,其主要作用就是用来处理一些其他组件无法完成的功能。同样在不同的版本中具有不同的源码: ☑ Less版本:对应的源码文件是 panel…

深度学习论文分享(五)DDFM: Denoising Diffusion Model for Multi-Modality Image Fusion

深度学习论文分享(五)DDFM: Denoising Diffusion Model for Multi-Modality Image Fusion 前言Abstract1. Introduction2. Background2.1. Score-based diffusion models2.2. Multi-modal image fusion2.3. Comparison with existing approaches 3. Meth…

解决ros-melodic-desktop-full(18.04)安装过程中未满足的依赖关系问题(注:也可以解决20.04noetic的)

自己安装火焰截图软件时使用sudo apt-get install flameshot时出现: 正在读取软件包列表... 完成 正在分析软件包的依赖关系树 正在读取状态信息... 完成 您也许需要运行“apt --fix-broken install”来修正上面的错误。 下列软件包有未满足的依赖关系:…

Vue组件通信原理及应用场景解析

🌷🍁 博主 libin9iOak带您 Go to New World.✨🍁 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~&#x1f33…

SolidWorks打开step.格式文件提示“输入的文件名无效、无法发现、被锁住或为不兼容的类型”的解决办法

有时候用SolidWorks打开step.格式文件会提示“输入的文件名无效、无法发现、被锁住或为不兼容的类型”,从而无法正常打开此文件,如图: 目前小编找了两种解决这个问题的办法,供大家参考: 方法一: 打开Solid…

istio安装部署总结

istio安装部署总结 大纲 istio基础概念版本选择安装istio核心主件卸载istiokiali安装 istio基础概念 https://istio.io/latest/zh/docs/ 中文文档 istio是一个服务治理平台,治理服务间的访问,(例如流量控制,安全策略&#xf…

第五讲:MySQL中DDL表的修改与删除

1、alter:改变 2、table:表 3、truncate:截断,删节 学习渠道:黑马程序员

如何创建高级 CSS 下拉菜单

效果展示 实现思路及部分代码 1、定义整体页面结构 从上述的效果展示图可以看出,页面的整体结构应该需要一个总菜单容器来装载父级菜单项,并且对应的父级菜单项应该有对应的菜单子项。子菜单是分类的话,我们还需要额外在扩展对应的容器来装…