JVM内存结构解析(图文详解)

news2024/12/23 1:32:48

JVM内存结构

共享 和 隔离

线程共享区域:方法区、堆、直接内存

线程隔离区域:虚拟机栈、本地方法栈、程序计数器

线程共享:定义一个变量或者一个方法,多线程都可以同时访问、修改这个方法或者变量

线程隔离:就是数据不能被多个线程同时访问,某些数据只属于一个线程

1.程序计数器

线程私有的。

作用:记录线程执行到哪一步,保存的是字节码的行号,用于正在执行的字节码指令的地址

我的理解:相当于是一个线程的进度条,记录一下当前执行到的位置,这样CPU切换了别的线程之后,当前线程就不会丢失任务的进度,下次的话就可以继续执行。

什么时候入栈,什么时候出栈、什么时候进入循环、跳转、异常,线程恢复等等由程序计数器来进行记录。

2.虚拟机栈

java中的栈通常是指虚拟机栈。

  • 虚拟机栈:每个线程运行时所需要的内存

  • 每个栈是由多个栈帧组成,对应这每次方法调用是所占的内存

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

虚拟机栈:线程私有的,每个方法执行的时候都会创建一一个栈帧, 用于存储局部(本地)变量表,里面存储的就是内存地址、操作数、动态链接和方法返回等信息,当线程请求的栈深度超过了虚拟机允许的最大深度时,就会抛出StackOverFlowError;

栈内存分配越大越好吗?

不是,因为增加栈大小,会造成每个线程的栈都变的很大,使得一定的栈空间下,能创建的线程数量会变小。

垃圾回收是否会涉及倒虚拟机栈?

不会;垃圾回收只会涉及到方法区和堆中,方法区和堆也会存在栈溢出的可能; 程序计数器,只记录运行下一行的地址,不存在栈溢出和垃圾回收; 虚拟机栈和本地方法栈,都是只涉及压栈和出栈,可能存在栈溢出,不存在垃圾回收.

栈内存溢出情况

  1. 栈帧过多导致栈内存溢出,典型问题:递归调用

  2. 栈帧过大导致栈内存溢出,你不改默认值的话一般不会出现这个问题

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

  1. 如果方法内局部变量没有逃离方法的作用范围,它是线程安全的

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

 

3.本地方法栈

操作系统的本地方法,跟java中的c语言是自己封装的,操作系统不认识,的需要操作系统的本地c语言进行翻译识别,最终一步翻译。

本地方法栈:线程私有的,保存的是本地方法的信息,当一个jvm创建的线程调用本地方法后,jvm不会在虚拟机栈中为该线程创建栈帧,而是简单的动态链接并直接调用调用操作系统提供的某些方法;

就是java的执行,最终需要把我们的方法翻译成操作系统可识别的语言,本地方法栈就是存放翻译后的方法

4.堆

是线程共享的,作用:存 对象实例、数组等。内存不够的时候:抛异常OutOfMemoryError

组成:又分为 年轻代 和 老年代

年轻代:被划分为三部分,Eden区和两个大小严格相同的Survivor区,根据JVM的策略,在经过几次垃圾收集后,任然存活于Survivor的对象将被移动到老年代区间。 ​ 老年代:主要保存生命周期长的对象,一般是一些老的对象

java7和java8的 堆 区别:

Java8为了让堆节省空间,防止内存溢出,做了优化:把 方法区/永久代 放到了本地内存中。

  • 1.7中有有一个永久代,存储的是类信息、静态变量、常量、编译后的代码

  • 1.8移除了永久代,把数据存储到了本地内存的元空间中,防止内存溢出

5.方法区

线程共享的。

主要存储类的信息、运行时常量池。

方法区:存放已被加载的类信息、常量、静态变量、即时编译器编译后的代码数据,即永久代

类加载:JDK编译java文件后的class文件从磁盘加载到内存中,类一开始从磁盘加载到内存的时候先加载到方法区

Class文件中除了有类的版本、字段、方法、接口等描述信息

jdk1.8中不存在方法区了,被元数据区(元空间)替代了,原方法区被分成两部分:

1: 加载的类信息,2:运行时常量池;

加载的类信息被保存在元数据区中,运行时常量池保存在堆中;

字符串常量池

1、在JDK1.7前,运行时常量池+字符串常量池是存放在方法区中,HotSpot VM对方法区的实现称为永久代。

2、在JDK1.7中,字符串常量池从方法区移到堆中,运行时常量池保留在方法区中。

3、在JDK1.8中,HotSpot移除永久代,使用元空间代替,此时字符串常量池保留在堆中,运行时常量池保留在方法区中,只是实现不一样了,JVM内存变成了直接内存。

运行时常量区

运行时常量池是方法区的一部分

方法区是一个大数组,常量区是数组的一部分,类加载后的常量池表的内容存放到方法区的运行时常量池中

6.直接内存

不属于JVM的内存结构,是操作系统的内存,常见于NIO操作,主要用于数据缓冲区,它分配回收成本较高,但读写性能高

NIO比常规的IO 快很多,

因为常规IO读取文件的流程是: 磁盘文件 -》 系统缓存区 -》 java缓冲区。

NIO的话是:磁盘文件 -》 直接内存。直接内存是java堆内存和系统内存都能访问的,java代码访问的时候就比上面的方式烧了一次复制的步骤,所以速度快

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

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

相关文章

iPhone恢复出厂设置,掌握2个方法!

当您的手机出现闪退、内存不足、严重卡顿等情况,或者是想将手机进行二手转让时,您可能需要通过将iphone恢复出厂设置来解决问题。但是恢复出厂设置后,手机上的所有数据都会被清除。iPhone怎么恢复出厂设置?本文将为您介绍两种简单…

混淆矩阵和数据不平衡 (2/3)

一、说明 当我们的数据标签具有比另一个类别更多的类别时,我们说我们有数据不平衡。 如果数据集数据不平恒,如何评估分类器的效果?如果分类器不好,如何改进分类器?本篇将讲述不平衡数据下,混淆矩阵的应用。…

许战海战略文库|品类缩量时代:制造型企业如何跨品类打造份额产品?

所有商业战略的本质是围绕着竞争优势与竞争效率展开的。早期,所有品牌立足于从局部竞争优势出发。因此,品牌创建初期大多立足于单个品类。后期增长受限,就要跨品类持续扩大竞争优势,将局部竞争优势转化为长期竞争优势,如果固化不前很难获得增…

玩转 gpgpu sim 02记 —— 构建了什么

1. 设置环境变量 编译gpgpu-sim 需要先运行脚本 setup_environment , source setup_environment, 注释如下,主要是设置一些 Makefile中会用到的环境变量 # see README before running this # 下面这句用来检测当前的shell环境是不是 bash 或者 sh 或者 …

GD32F303窗口看门狗在待机模式下运行

1.窗口看门狗 独立看门狗的时钟关闭不了,所以低功耗模式下需要定期唤醒喂狗,否则就会重启,比较麻烦。窗口看门狗使用的是APB1时钟,低功耗模式下时钟就停止了,所以不需要定期唤醒喂狗。但是窗口看门狗有喂狗的时间窗口&…

韩国市场最全开发攻略

2022年1月1日,RCEP正式生效施行,韩国也是首次跟中国缔结自贸条约,更低的关税,更灵活的贸易规则、更简洁的通关程序都将为中韩在贸易上继续发力增加了更多可施展的空间。这也将帮助更多的企业在东亚市场大展拳脚,推进整…

归并排序~

将一个无序系列,分成小系列,相邻两个小系列进行排序合并,再将两个相邻小系列排序合并,。。。。 int[] data {0,5,4,8,9,3,2,67,23} len 9 第一次每个元素一组 0,5,4,8,9,3,2,67,23 相邻排序合并 …

Vue框架分享与总结

总结开发中最常用的vue语法,以及对特定语法的理解。vue官网 文章目录 一、创建vue项目1、使用开发工具创建2、使用命令行创建3、vue框架结构4、Vue文件结构 二、Vue 常用模板语法1、v-if、v-show2、v-for3、v-on4、v-bind5、v-model 三、组件通信1、父组件给子组件传…

Bytebase 2.8.0 - ​全新升级的数据脱敏功能

🚀 新功能 全新升级的数据脱敏功能,提供更加细化的脱敏和访问权限配置。全新升级的 SQL 编辑器界面。库表同步功能支持 Oracle。支持设置公告。 🎄 改进 新增基于 MySQL parser 的数据脱敏内核。调整了侧边栏数据库列表,用最近…

Docker实战-第一章欢迎来到Docker世界

Docker基础 什么是Docker docker是包括一个命令行程序、后台守护进程和一组远程服务,它简化了安装、运行、发布和删除软件的工作。docker实现的基础是UNIX的容器技术。所以在docker出世之前已经有容器的概念,而且像谷歌一类公司也在探索自己的容器&…

关于taos数据库使用过程中突发“unable to establish connection”问题解决

项目使用的版本信息 1.taos的版本信息 3.0.4.1 2.jdbc的版本 3.2.1 3.druid连接池版本 1.2.11问题描述 Java应用服务连接,突然大量抛出如下的异常信息导致应用宕机: sql: select server_status(), desc: unable to establish connection和集团DBA沟通…

云原生微服务 第四章 Spring Cloud Netflix 之 Eureka

系列文章目录 第一章 Java线程池技术应用 第二章 CountDownLatch和Semaphone的应用 第三章 Spring Cloud 简介 第四章 Spring Cloud Netflix 之 Eureka 文章目录 系列文章目录[TOC](文章目录) 前言1、Eureka 两大组件2、Eureka 服务注册与发现3、案例3.1、创建主工程3.1.1、主…

(超详解)堆排序+(图解)

目录: 1:如何建堆(两种方法) 2:两种方法建堆的时间复杂度分析与计算 3:不同类型的排序方式我们应该如何建堆 文章正式开始: 1:如何建堆 在实现堆排序之前我们必须得建堆,才能够实现堆排序 首先在讲解如何建堆之前让我们先来回顾一…

保研复习-计算机组成原理

计算机组成原理 计算机组成冯诺依曼体系结构计算机系统的层次结构计算机的五大组成部件编译和解释的区别 CPUCPU的组成寄存器的类型指令类型指令功能指令执行过程 存储器存储器的层次结构寻址方式 输入和输出io方式有哪几种IO接口的基本结构 计算机组成 冯诺依曼体系结构 存储…

如何将你在树莓派上部署的 IoT 物联网 MQTT 服务发布到公网?

​ 上一章,你成功的在树莓派搭建了 EMQX 开源社区版,用来提供 MQTT 服务,并验证了设备端接入和消息通信。但你发现只能在局域网内访问 emqx.local 服务,而 IoT 设备分布在全国各地公共网络环境,这些设备该如何接入呢&a…

Android 13 CameraMetadata详解1 (内存分布以及增删改查)

文章目录 简介allocate_camera_metadataadd_camera_metadata_entrydelete_camera_metadata_entryupdate_camera_metadata_entryfind_camera_metadata_entry 点赞收藏加关注,下次找我不迷路。 也欢迎关注微信公众号 无限无羡 期待与你的相识! 简介 初识…

【面试必刷TOP101】删除链表的倒数第n个节点 两个链表的第一个公共结点

目录 题目:删除链表的倒数第n个节点_牛客题霸_牛客网 (nowcoder.com) 题目的接口: 解题思路: 代码: 过啦!!! 题目:两个链表的第一个公共结点_牛客题霸_牛客网 (nowcoder.com) …

雷达仿真:FMCW DDMA-MIMO 3D点云获取方法

1.DDMA-MIMO原理 由于TDMA-MIMO采用不同单天线交替发射信号,没有更好的利用发射天线同时工作的发射资源,导致发射功率低以及损耗大,从而使得TDMA波形只能应用在近距离探测的低功率雷达场景。而DDMA波形则能很好的弥补TDMA上述缺点&#xff0c…

为什么用IP访问网站也要使用SSL证书

IP地址SSL证书是一种专门用于公网IP地址验证的数字证书。它可以为公网IP地址提供安全的数据传输保障,解决了IP地址明文传输的安全隐患,保护了IP地址的数据传输安全。 与普通的SSL证书不同,IP地址SSL证书是基于IP地址进行验证的。在申请IP地址…

ssh登录时间久或登陆后报错

情况1 问题描述: ssh登录时间很久,登录后出现abrt-cli status timed out 的报错 问题原因: .lock文件被锁导致 执行systemctl status abrtd.service可以看到被锁的.lock 处理方式: ps -ef | grep pid 找到被锁的进程kill掉…