JVM - 运行时数据区域

文章目录

  • 程序计数器
  • 方法区
  • 知识延申 -- 字符串常量池

程序计数器

并发情况下,会发生线程之间的上下文切换,当 线程1 的CPU时间片用完后,需要程序计数器记录 线程1 的下一条JVM指令的地址,等下一次 线程1 继续运行的时,才能从正确的位置开始继续执行

程序计数器是线程私有的 , 既 一个线程计数器 记录一个 线程 的指令位置

而且程序计数器是运行时数据区域唯一一个不存在内存溢出的区域

线程是什么?实际上可以理解为线程就是一个栈

线程调用方法 就是复制方法入栈的过程

方法入栈后就会形成栈帧

比如下面的一段代码

public class JvmDemo {public static void main(String[] args) {System.out.println("开始");func();System.out.println("结束");}  public static void func(){}   
}

执行该程序会创建一个主线程,然后main方法入栈,示意图如下

在这里插入图片描述
接着mian方法执行到 func(); ,就会复制一份 func 方法入栈,如下

在这里插入图片描述
func方法执行完后出栈,如下

在这里插入图片描述
最后mian方法再出栈

我们说线程可以简单的认为就是栈,所以也很明显,栈是线程私有的

栈的容量有限,如果我们不断调用方法入栈,就会导致栈溢出 ( 比如递归时没有递归出口 )

栈分为 虚拟机栈本地方法栈

可以简单理解为 :
-入栈的方法由 java 语言编写 的为虚拟机栈
-入栈的方法由 C语言编写 的为本地方法栈

Object类中有很多本地方法,比如反射中用到的 public final native Class<?> getClass(); ,添加了native 关键字,使用C语言编写,为了能直接对接操作系统

关于栈的几个问题:

  1. 垃圾回收是否涉及栈内存? 不涉及 ,因为栈帧执行完就会自动出栈,无需垃圾回收
  2. 栈内存是否分配越大越好吗?错误 ,物理内存大小一定,栈内存越大,能同时纯在的栈就会越少,既 线程数会越少
  3. 方法内的局部变量是否是线程安全的? 是线程安全的,线程调用方法是复制方法入栈,所以每个线程都有自己的方法副本,也就有了自己的局部变量副本,所以在操作时,不会受到其他线程的干扰

堆 – 存储对象实例

比如下面代码

public class JvmDemo {public static void main(String[] args) {Person person = new Person();}
}class Person{}

其在内存中的模型如下
在这里插入图片描述
person引用存在main方法的栈帧中,而person实例对象存在于堆区中

堆区是所有线程共享的 ,比如

public class JvmDemo {public static void main(String[] args) {Person person = new Person();Thread thread01=new Thread(()->{Person person01 = new Person();});thread01.start();}
}class Person{}

则内存模型如下,为了突出重点,省略 thread01 引用和实例对象 在内存中的展示,以及 thread01.start(); 的调用过程
在这里插入图片描述
堆的内存有限,不能无限创建对象实例,否者会堆内存溢出

因此JVM存在堆区的垃圾回收机制,清除垃圾对象,垃圾对象 可以简单定义为没有引用指向的实例对象

比如

Person person = new Person;
person = new Person;

此时就没有引用指向第一个new出来的对象,那么它就会被垃圾回收

存在堆区中的对象实例是线程间共享的,对象中的 全局变量 需要考虑线程安全问题

比如

public class JvmDemo {public static void main(String[] args) throws InterruptedException {Person person = new Person();Thread thread01=new Thread(()->{for (int i=0;i<100000;i++){person.money++;}});thread01.start();for (int i=0;i<100000;i++){person.money++;}thread01.join();System.out.println(person.money);}
}
class Person{public int money=0;
}

输出的结果不一定是200000
在这里插入图片描述

方法区

方法区 – 存储 类信息静态变量、方法

在 jdk 1.8之前,方法区存在于JVM内存中,其实现方法被称为 永久代;jdk 1.8及之后,方法区从JVM内存移出到本地内存,其实现方法被称为 元空间

方法区是线程共享的,因此多个线程修改同一个类的静态变量的时候同样存在线程安全问题,比如

public class JvmDemo {public static void main(String[] args) throws InterruptedException {Thread thread01=new Thread(()->{for (int i=0;i<100000;i++){Person.money++;}});thread01.start();for (int i=0;i<100000;i++){Person.money++;}thread01.join();System.out.println(Person.money);}
}
class Person{public static int money=0;
}

输出结果同样不一定是200000,此处建议先学习一下什么是静态变量

方法区同样存在内存溢出的问题

知识延申 – 字符串常量池

JVM中还有一个特殊又重要的区域,就是 字符串常量池(StringTable),可以参考我的另外一篇博客

【Java 基础】你真的会用 String 吗?

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

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

相关文章

水环境综合治理监测系统:筑牢城市水生态安全屏障

水是生命之源&#xff0c;是人类赖以生存的基础。然而&#xff0c;随着工业化、城市化的快速发展&#xff0c;水污染问题日益凸显&#xff0c;给居民的环境卫生以及用水安全带来了巨大的威胁。因此&#xff0c;加强水环境综合治理&#xff0c;保护水资源和维护生态平衡&#xf…

28.1 kibana

Kibana 是一个免费且开放的用户界面&#xff0c;能够对 Elasticsearch 数据进行可视化操作&#xff0c;从跟踪查询负载&#xff0c;到理解请求如何流经整个应用&#xff0c;都能轻松完成。 1.Kibana安装 注意要与ES版本保持一致 https://www.elastic.co/downloads/past-relea…

看完这篇,别再说不会Spring 分库分表了

多数据源&#xff0c;读写分离&#xff0c;分库分表&#xff0c;基本上已经是现在任何一个项目的基本配置了&#xff0c;在之前的文章Spring多数据源实现https://blog.csdn.net/wangerrong/article/details/131910740 里讲了多数据源的实现&#xff0c;其实已经包含了读写分离…

Linux使用教程

一、Linux命令基础 1、ls、ll命令——展示数据 ①ls命令——平铺展示数据 其中ls命令以平铺的方式展现数据 ②ll命令——列表展示数据 ll命令以列表的方式展现数据 -a选项&#xff0c;表示&#xff1a;all的意思&#xff0c;即列出全部文件&#xff08;包含隐藏的文件/文件夹…

ARM寄存器组织

一、寄存器二、ARM寄存器三、专用寄存器四、CPSR寄存器 一、寄存器 概念 寄存器是处理器内部的存储器&#xff0c;没有地址 作用 一般用于暂时存放参与运算的数据和运算结果 分类 包括通用寄存器、专用寄存器、控制寄存器 二、ARM寄存器 注 在某个特定模式下只能使用当前模…

Solidity合约开发注意项

目录 一、原则二、查询里的异常处理三、小数四、访问子合约的变量五、实现结构体继承的功能六、address转string七、字符串判等比较八、简单的地址合法性校验九、字符串拼接十、实现Set集合十一、参数是结构体的event的签名 最近在开发一组自主链权限治理的Solidity合约&#x…

Web浪漫历程:揭秘二十年间与您“约会”的浏览器发展

&#x1f9d1;‍&#x1f4bc; 个人简介&#xff1a;一个不甘平庸的平凡人&#x1f36c; &#x1f5a5;️ Node专栏&#xff1a;Node.js从入门到精通 &#x1f5a5;️ TS知识总结&#xff1a;十万字TS知识点总结 &#x1f449; 你的一键三连是我更新的最大动力❤️&#xff01;…

Kafka基础架构与核心概念

Kafka简介 Kafka是由Apache软件基金会开发的一个开源流处理平台&#xff0c;由Scala和Java编写。Kafka是一种高吞吐量的分布式发布订阅消息系统&#xff0c;它可以处理消费者在网站中的所有动作流数据。架构特点是分区、多副本、多生产者、多订阅者&#xff0c;性能特点主要是…

React + 二级目录 + Nginx配置

背景&#xff1a; 由于子域名有限&#xff0c;我们需要将不同的前端项目进行二级目录区分。 一、项目 现有三个项目&#xff1a; bsrm-web-manage bsrm-web-operator bsrm-web-testingorganization 二、期望访问路径 http://bsrm.life.com/bsrm-web-manage http://bsrm.lif…

手机照片误删除?无需担忧,点击这里,即可轻松恢复

手机照片误删除&#xff1f;无需担忧&#xff0c;点击这里&#xff0c;即可轻松恢复 开头&#xff1a;在数字化时代&#xff0c;手机已成为我们生活中不可或缺的伙伴。随着手机摄影的普及&#xff0c;我们记录了许多珍贵的瞬间和回忆。然而&#xff0c;有时候我们不小心误删除…

Python编译过程和执行原理

hello&#xff0c;这里是Token_w的文章&#xff0c;主要讲解python的基础学习&#xff0c;希望对大家有所帮助 整理不易&#xff0c;感觉还不错的可以点赞收藏评论支持&#xff0c;感谢&#xff01; 目录 一. Python执行原理二. Python内部执行过程2.1 编译过程概述2.2 过程图解…

遥感数字图像处理实验教程(韦玉春)--部分实验问题回答

个人的学习思考&#xff0c;仅供参考。 目录 实验三、图像合成和显示增强 一、目的 二、要求 三、实验 实验五、图像变换 一、目的 二、要求 三、实验 实验六、图像滤波 一、目的 二、要求 三、实验 实验七、图像分割 一、目的 二、要求 三、实验 实验八、图…

linux判断端口是否占用(好用)

netstat 一般的话使用 netstat -tunlp | grep xxx参数作用-t指明显示TCP端口-u指明显示UDP端口-l仅显示监听套接字(所谓套接字就是使应用程序能够读写与收发通讯协议(protocol)与资料的程序)-p显示进程标识符和程序名称&#xff0c;每一个套接字/端口都属于一个程序。-n不进行…

Could not find toolchain file: E:/Git/build/cmake/android.toolchain.cmake问题解决

问题描述 在Windows下编译MNN的Android平台时&#xff0c;需要运行.sh文件&#xff0c;那么之后几种方式&#xff1a; 在power shell中启动git bash&#xff0c;但是这个窗口一闪而过&#xff0c;看不清输出的信息&#xff0c;可以通过在脚本中最后一行加入&#xff1a;sleep…

如何轻松找到竞品独立站?竞品独立站搜罗神器曝光!

独立站竞品调研对做好独立站来说的重要性不言而喻。还在纠结想做独立站但不会找竞品独立站&#xff1f;不知道怎么分析竞品独立站&#xff1f;今天东哥倾囊相授&#xff0c;把压箱底的秘籍教给你&#xff01; 怎么找竞品独立站&#xff1f; 1、谷歌购物广告 在谷歌购物页搜索产…

爬虫002_python程序的终端运行_文件运行_ipython的使用---python工作笔记020

用python运行一个文件,就是要写一个.py结尾的文件 然后保存 然后直接cmd中,python 然后写上py文件的路径就可以了 然后看一下内容 看一下终端中运行,直接输入python进入python环境,然后写python代码 回车运行 退出可以用exit()

设计模式——单例模式

1 概述 单例模式就是保证一个类只有一个对象实例。 为了保证无法创建多余的对象实例&#xff0c;单例类中需要自己创建对象实例&#xff0c;并把自己的构造方法私有化以防止其他地方调用创建对象&#xff0c;且需要提供一个公共的方法给其他类来获取该单例类的实例。 同时单例…

Linux笔记——rpm与yum下载软件命令介绍

系列文章目录 Linux笔记——进程管理Linux笔记——进程管理与网络监控技术讲解Linux笔记——进程管理 Linux笔记——管道相关命令以及shell编程 Linux笔记——磁盘进行分区与挂载介绍 文章目录 系列文章目录 前言 一 RPM介绍 1.1 RPM简单介绍 1.2 RPM命令语法 1.2.1 …

数学建模学习(2):数学建模各类常用的算法全解析

一、评价类算法 常见的评价算法 1.层次分析法 基本思想 是定性与定量相结合的多准则决策、评价方法。将决策的有关元素分解成 目标层、准则层和方案层 &#xff0c;并通过人们的 判断对决策方案的 优劣进行排序 &#xff0c;在此基础上进行定性和定量分析。它把人的思维过程…

工程师副高职称的评审条件

根据《专业技术人员职务评审暂行规定》和《工程技术人员职务评审暂行办法》&#xff0c;工程师副高职称的评审条件主要包括以下几方面&#xff1a; • 学历要求&#xff1a;具有本科及以上学历&#xff0c;或者具有大专学历并通过国家承认的专业技术资格考试。 • 工作年限要…