Java内存分布:Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域:方法区、虚拟机栈、本地方法栈、堆、程序计数器。

1.程序计数器
程序计数器是一块较小的内存空间,它可以看做是当前线程所执行的字节码的行号指示器。在虚拟机的概念模型中,字节码解释器工作时就是通过改变这个计数器的值来选取吓一条需要执行的字节码指令。
分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。
为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各条线程之间计数器互不影响,独立存储,所以该类内存区域为 “线程私有“ 的内存。
如果线程正在执行的是一个Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;如果正在执行的是Native方法,这个计数器值则为空,此内存区域是唯一一个子啊Java虚拟机规范中没有规定任何OutOfMemoryError情况的区域。
2.Java虚拟机栈
与程序计数器一样,Java虚拟机栈也是线程私有的,它的生命周期和线程相同。虚拟机栈描述的是Java方法执行的内存模型;每个方法在执行的同时都会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息。
每一个方法从调用到执行完成,都对应着一个栈帧在虚拟机栈中入栈到出栈的过程。
局部变量表存放了编译期可知的各种基本数据类型、对象引用(不等同于对象,是指向对象的引用)和returnAddress类型。如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常,如果无法申请到足够的内存会抛出OutOfMemory异常。
3.本地方法栈
本地方法栈和虚拟机栈之间的区别是虚拟机栈为虚拟机执行的Java(字节码)服务,而本地方法栈则为虚拟机使用到的Native方法服务。
4.Java堆
Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,Java堆是垃圾回收器管理的主要区域
5.方法区
方法区和Java堆一样,是各个线程共享的内存区域,用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
6.运行时常量池
运行时常量池是方法区的一部分。Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池,用于存放编译期生成的各种字面量和符号引用,这部分内容将会在类加载后进入方法区的运行时常量池中存放。
网上很多解释常量池会以字符串为例:
比如
String s1 = "Hello";
String s2 = "Hello";
String s3 = "Hel" + "lo";
String s4 = "Hel" + new String("lo");
String s5 = new String("Hello");
String s6 = s5.intern();
String s7 = "H";
String s8 = "ello";
String s9 = s7 + s8;
System.out.println(s1 == s2); // true
System.out.println(s1 == s3); // true
System.out.println(s1 == s4); // false
System.out.println(s1 == s9); // false
System.out.println(s4 == s5); // false
System.out.println(s1 == s6); // true
s1==s2为true很好理解,指向同一个常量池的内存地址。
s1==s3为true:对于s3而言,由于拼接的都是字面量,那么编译器会进行优化,其实就是指s3="Hello"
s1==s4为false:由于new String("lo")并不是一个字面量,而是一个变量,这样的话编译器不会进行优化,因为该变量可能会发生变化。
s1==s9为false:和上面一样的道理。
s4==s5:两个不同对象的引用当然不同。
s1==s6:由于String.intern()方法是指:如果常量池已经包含一个等于此 String 对象的字符串(该对象由 equals(Object) 方法确定),则返回池中的字符串。否则,将此 String 对象添加到池中,并且返回此 String 对象的引用。 它遵循对于任何两个字符串 s 和 t,当且仅当 s.equals(t) 为 true 时,s.intern() == t.intern() 才为 true。
希望本篇文章对您有所帮助
# Java内存分布详解
# Java内存分布
# 再也不用怕! 让你彻底搞明白Java内存分布
# Java内存模型之happens-before概念详解
# Java基础之Unsafe内存操作不安全类详解
# java boolean占用内存大小说明
# java内存分布实现代码
# 的是
# 池中
# 行号
# 则为
# 抛出
# 都是
# 量表
# 加载
# 很好
# 是指
# 已被
# 会在
# 把它
# 这部
# 它可以
# 为例
# 时就
# 跳转
# 将此
# 较小
相关文章:
如何在IIS管理器中快速创建并配置网站?
合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?
如何快速上传建站程序避免常见错误?
深入理解Android中的xmlns:tools属性
c# F# 的 MailboxProcessor 和 C# 的 Actor 模型
青岛网站建设如何选择本地服务器?
胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?
如何在橙子建站上传落地页?操作指南详解
中山网站推广排名,中山信息港登录入口?
c# 服务器GC和工作站GC的区别和设置
整蛊网站制作软件,手机不停的收到各种网站的验证码短信,是手机病毒还是人为恶搞?有这种手机病毒吗?
,如何利用word制作宣传手册?
,石家庄四十八中学官网?
陕西网站制作公司有哪些,陕西凌云电器有限公司官网?
建站之星上传入口如何快速找到?
北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?
香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南
寿县云建站:智能SEO优化与多行业模板快速上线指南
重庆市网站制作公司,重庆招聘网站哪个好?
西安专业网站制作公司有哪些,陕西省建行官方网站?
网站设计制作企业有哪些,抖音官网主页怎么设置?
建站之星后台管理:高效配置与模板优化提升用户体验
如何在阿里云香港服务器快速搭建网站?
如何用VPS主机快速搭建个人网站?
如何登录建站主机?访问步骤全解析
如何快速选择适合个人网站的云服务器配置?
如何挑选最适合建站的高性能VPS主机?
建站之星安装后界面空白如何解决?
C#如何在一个XML文件中查找并替换文本内容
深圳网站制作平台,深圳市做网站好的公司有哪些?
制作电商网页,电商供应链怎么做?
常州自助建站:操作简便模板丰富,企业个人快速搭建网站
广州网站设计制作一条龙,广州巨网网络科技有限公司是干什么的?
潍坊网站制作公司有哪些,潍坊哪家招聘网站好?
,想在网上投简历,哪几个网站比较好?
如何在局域网内绑定自建网站域名?
开封网站制作公司,网络用语开封是什么意思?
最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?
如何在阿里云虚拟服务器快速搭建网站?
建站中国官网:模板定制+SEO优化+建站流程一站式指南
番禺网站制作公司哪家值得合作,番禺图书馆新馆开放了吗?
详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)
建站主机无法访问?如何排查域名与服务器问题
如何解决ASP生成WAP建站中文乱码问题?
宁波免费建站如何选择可靠模板与平台?
制作网站的软件下载免费,今日头条开宝箱老是需要下载怎么回事?
北京建设网站制作公司,北京古代建筑博物馆预约官网?
网站建设制作需要多少钱费用,自己做一个网站要多少钱,模板一般多少钱?
如何在Golang中实现微服务服务拆分_Golang微服务拆分与接口管理方法
定制建站平台哪家好?企业官网搭建与快速建站方案推荐
*请认真填写需求信息,我们会在24小时内与您取得联系。