当前位置: 首页 > 编程日记 > 正文

JVM堆 栈 方法区详解

一、栈

每当启用一个线程时,JVM就为他分配一个JAVA栈,栈是以帧为单位保存当前线程的运行状态

栈是由栈帧组成,每当线程调用一个java方法时,JVM就会在该线程对应的栈中压入一个帧

只有在调用一个方法时,才为当前栈分配一个帧,然后将该帧压入栈

栈帧帧是由局部变量区、操作数栈和帧数据区组成

java栈上的所有数据都是私有的,任何线程都不能访问另一个线程的栈数据

局部变量区  调用方法时,类型信息确定此方法局部变量区和操作数栈的大小

局部变量区被组织为以一个字长为单位、从0开始计数的数组,类型为short、byte和char的值在存入数组前要被转换成int值,而long和double在数组中占据连续的两项,在访问局部变量中的long或double时,只需取出连续两项的第一项的索引值即可,如某个long值在局部变量区中占据的索引时3、4项,取值时,指令只需取索引为3的long值即可

runInstanceMethod的局部变量区第一项是个reference(引用),它指定的就是对象本身的引用,也就是我们常用的this

但是在runClassMethod方法中,没这个引用,那是因为runClassMethod是个静态方法。

 操作数栈  可把操作数栈理解为存储计算时,临时数据的存储区域。

和局部变量区一样,操作数栈也被组织成一个以字长为单位的数组。

但和前者不同的是,它不是通过索引来访问的,而是通过入栈和出栈来访问的。

int a = 100;

  int b = 98;

  int c = a + b;

帧数据区   java栈帧通过帧数据区存的数据来支持常量池解析、正常方法返回以及异常派发机制

当JVM执行到需要常量池数据的指令时,它都会通过帧数据区中指向常量池的指针来访问它。

处理java方法的正常结束和异常终止:如果是通过return正常结束,则当前栈帧从Java栈中弹出,恢复发起调用的方法的栈。如果方法有返回值,JVM会把返回值压入到发起调用方法的操作数栈。

为了处理java方法中的异常情况,帧数据区还必须保存一个对此方法异常引用表的引用。当异常抛出时,JVM给catch块中的代码。如果没发现,方法立即终止,然后JVM用帧区数据的信息恢复发起调用的方法的帧。然后再发起调用方法的上下文重新抛出同样的异常。

1.Java中的基本数据类型不一定存储在栈中,如果该变量是基本数据类型则存储在栈中,

该变量是一个对象(如:int[] array=new int[]{1,2};),则在堆中。

2.为什么函数调用要用栈实现?

函数调用的局部状态之所以用栈来记录是因为这些数据的存活时间满足“后入先出”(LIFO)顺序,而栈的基本操作正好就是支持这种顺序的访问

二、堆

(不再造轮子,出门左转  JVM入门——JVM内存结构)

三、方法区

用于存储虚拟机加载的:静态变量+常量+类信息+运行时常量池

类信息:类的版本、字段、方法、接口、构造函数等描述信息

运行时常量池用于存储 Java 类文件常量池中的符号信息

运行时常量池中保存着一些 class 文件中描述的符号引用,同时还会将这些符号引用所翻译出来的直接引用存储在运行时常量池中

HotSpot 方法区变迁

在 JDK1.2 ~ JDK6 的实现中,HotSpot 使用永久代实现方法区

JDK7+ 移除永久代  字符串常量和类引用被移动到 Java Heap中

Oracle 同时收购了 BEA 和 Sun 公司,同时拥有 JRockit 和 HotSpot,在将 JRockit 许多优秀特性移植到 HotSpot 时由于 GC 分代技术遇到了种种困难,所以从 JDK7 开始 Oracle HotSpot 开始移除永久代

影响示例:

1.

public class Test2 {public static void main(String[] args) {/*** 首先设置 持久代最大和最小内存占用(限定为10M)* VM args: -XX:PermSize=10M -XX:MaxPremSize=10M*/List<String> list  = new ArrayList<String>();// 无限循环 使用 list 对其引用保证 不被GC  intern 方法保证其加入到常量池中int i = 0;while (true) {// 此处永久执行,最多就是将整个 int 范围转化成字符串并放入常量池list.add(String.valueOf(i++).intern());}}
}

将整个 int 范围转化成字符串并放入常量池
  JDK1.6常量池在方法区(永久带),设置了最大内存为10M,导致Perm 内存溢出
  JDK1.7及以后常量池在堆中,代码执行不会有问题

2.

public class Test1 {public static void main(String[] args) {String s1 = new StringBuilder("漠").append("然").toString();System.out.println(s1.intern() == s1);String s2 = new StringBuilder("漠").append("然").toString();System.out.println(s2.intern() == s2);}}

JDK6 下执行结果为 false、false

在 JDK7 以上执行结果为 true、false

1.在 Java 中直接使用双引号展示的字符串将会在常量池中直接创建
2.String的intern方法首先将尝试在常量池中查找该对象,如果找到则直接返回该对象在常量池中的地址;找不到则将该对象放入常量池后再返回其地址
3. s1--对象堆中的地址
  s1.intern()--对象常量池中的引用(JDK1.6方法区 JDK1.7堆)
  ==>JDK1.6 false JDK1.7 true
4.JDK1.7 s2.intern() == s2 false原因:
  s2--新对象s2堆中的地址
  s2.intern()--首先尝试在常量池中查找该对象,找到s1(s1.intern()已经将该对象放入常量池),返回s1的地址


参考资料

1.深入JVM——栈和局部变量

2.Java堆和栈看这篇就够了

3.JVM入门——JVM内存结构

4.Java 内存之方法区和运行时常量池

转载于:https://www.cnblogs.com/hexinwei1/p/9414018.html

相关文章:

ECSHOP学习笔记

帮助 http://help.ecshop.com/index.phpECSHOP各文件夹功能说明 1、根目录&#xff1a;前台程序文件2、admin&#xff1a;后台程序文件夹 --根目录&#xff1a;后台程序文件 *.php文件 --help\zh_cn&#xff1a;各功能的帮助文件 *.xml文件 --images&#xff1a;后台页面…

Redis主从复制配置

环境描述Redis Master&#xff1a;192.168.1.100 6379(Ubuntu系统)Redis Slave1&#xff1a;192.168.1.101 6380(Ubuntu系统)Redis Slave2&#xff1a;192.168.1.102 6381(Ubuntu系统) 安装redis分别在192.168.1.100、192.168.1.101、192.168.1.102三台机器上安装redis&#xf…

利用 Python 打造一个语音合成系统

作者 | thedaydreamer来源丨CSDN博客背景一直对语音合成系统比较感兴趣&#xff0c;总想能给自己合成一点内容&#xff0c;比如说合成小说&#xff0c;把我下载的电子书播报给我听等等。语音合成系统其实就是一个基于语音合成的工具&#xff0c;但是这个东西由于很多厂家都提供…

干货:排名前 16 的 Java 工具类!

2019独角兽企业重金招聘Python工程师标准>>> 干货&#xff1a;排名前 16 的 Java 工具类&#xff01; 在Java中&#xff0c;工具类定义了一组公共方法&#xff0c;这篇文章将介绍Java中使用最频繁及最通用的Java工具类。以下工具类、方法按使用流行度排名&#xf…

使用ecshop电子商务系统的100个小问题

总结100条关于操作ecshop电子商务系统的小问题。1:如何修改网站"欢迎光临本店"回答:languages\zh_cn\common.php文件中&#xff0c; $_LANG[welcome] 欢迎光临本店;将他修改成你需要的字样。2:如何修改首页"热门搜索关键字"回答:后台->系统设置->网…

MyCAT常用分片规则之分片枚举

MyCAT支持多种分片规则&#xff0c;下面测试的这种是分片枚举。适用场景&#xff0c;列值的个数是固定的&#xff0c;譬如省份&#xff0c;月份等。 在这里&#xff0c;需定义三个值&#xff0c;规则均是在rule.xml中定义。 1. tableRule 2. function 3. mapFile 首先&#xff…

手把手带你打造一款 签名设计 的GUI图形界面!

作者 | 黄伟呢来源丨数据分析与统计学之美1.概述 整体布局呢我们已经搭建起来&#xff0c;唯一没有实现的一个步骤就是&#xff0c;用户每输入一个名字&#xff0c;就会将个性签名一并显示在这个窗口界面中&#xff0c;今天我就带着大家一起完成这个需求。今天的文章可以看成是…

跨域资源共享 CORS

简介 CORS是一个W3C标准&#xff0c;全称是"跨域资源共享"&#xff08;Cross-origin resource sharing&#xff09;。它允许浏览器向跨源服务器&#xff0c;发出XMLHttpRequest请求&#xff0c;从而克服了AJAX只能同源使用的限制。 CORS需要浏览器和服务器同时支持。…

SMARTY核心

http://www.smarty.net/http://smarty.php.net/manual/en/1.配置define("ROOTPATH",dirname(__FILE__)."/../");require_once("smarty/Smarty.class.php");/*** Smarty Template Class Initializtion*/if( constant( "ENABLED_TPL" ) …

5G+XR:让视频增强技术在工业领域大有所为

据工业和信息化部统计显示&#xff0c;目前中国累计建成并开通5G基站142.5万个&#xff0c;基站总数今年有望突破200万个。自5G正式商用以来&#xff0c;凭借其高带宽、广连接、低延时等优势&#xff0c;5G应用的实践逐渐从最初的单一化业务触及至更广泛的行业应用场景中。其中…

IE的安全性设定增加“我的电脑”的安全性设定

HKEY_CURRE-NT_USER\Software\Microsoft\Windows\CurrentVersion\InternetSettings\Zones\0&#xff0c;在右边窗口中找到DWORD值“Flags”&#xff0c;默认键值为十六进制的21(十进制33)&#xff0c;双击“Flags”&#xff0c;在弹出的对话框中将它的键值改为“1”即可&#x…

F# 4.5提供Spans、Match!等特性

F# 4.5预览版现已发布&#xff0c;其中提供了一系列新特性&#xff0c;包括对.NET Core 2.1的新原生类型Span\u0026lt;T\u0026gt;的支持、新关键字Match!等。\\类型Span意在实现底层代码指针操作的安全性和可预测性&#xff0c;这可使得很多情况下不必再分配内存&#xff0c;进…

ecshop transport.js/run() error:undefined

在使用ECshop的AJAX(即&#xff1a;transport.js) IE有时候会出现&#xff1a;ReferenceError: process_request is not defined&#xff0c;FF则出现&#xff1a;transport.js/run() error:undefined&#xff0c;其实这完全和transport.js无关。那么问题出在哪里呢&#xff1f…

为什么你不应该自行更新 Drupal 网站?

&#xff08;译注&#xff1a;这篇文章主要还是针对于非专业人员及个人Drupal站长&#xff0c;对于专业的 Drupal 团队和公司而言 Drupal 的升级更新都有规范的操作流程&#xff0c;完全是家常便饭&#xff0c;不可能出现文中出现的这些情况。尽管如此&#xff0c;里面也还是有…

用友发布新一代企业智能商旅及费控服务平台

3月31日&#xff0c;“便捷商旅 智能费控—2022用友BIP|商旅及费控服务新品发布会”成功举行。作为新一代企业智能商旅及费控服务平台&#xff0c;用友BIP商旅及费控服务以“连接 高效 智能 合规”为核心价值理念&#xff0c;致力于让5000万报销人拥有极致的体验&#xff0c;让…

RNN,LSTM,GRU简单图解:

一篇经典的讲解RNN的&#xff0c;大部分网络图都来源于此&#xff1a;http://colah.github.io/posts/2015-08-Understanding-LSTMs/ 每一层每一时刻的输入输出&#xff1a;https://www.cnblogs.com/lovychen/p/9368390.html 带有权重标识的图&#xff1a;

ecshop模板smarty foreach详解 [ECshop]

{foreach},{foreachelse}{foreach} 用于像循环访问一个数字索引数组一样循环访问一个关联数组&#xff0c;与仅能访问数字索引数组的{section}不同&#xff0c;{foreach}的语法比 {section}的语法简单得多&#xff0c;但是作为一个折衷方案也仅能用于单个数组。每个{foreach}标…

自己动手,做一款抬头显示的「Todo Hud」

我用过好多款 TodoList 软件&#xff0c;但事情一多总还是丢三落四&#xff0c;原本计划好要做的事情总是安静地躺在某个角落&#xff0c;等我想起来要去扫一眼的时候&#xff0c;都已快「物是人非」。。。 要是能在桌面上实时显示 TodoList&#xff0c;那该多好&#xff01;但…

微软语音扩展全球语言支持,发布160个新声音

导语&#xff1a;全世界有数千种语言&#xff0c;最具语言天赋的人也只能说数十种&#xff0c;普通人能够学会两三种语言已属不易。然而&#xff0c;在科技日新月异的今天&#xff0c;具备自然语言对话能力的AI已经能够掌握上百种语言&#xff0c;扩展人类自身能力&#xff0c;…

P4269 [USACO18FEB]Snow Boots G

思维题。 以地板为序构造链表&#xff0c;再排序&#xff0c;然后删除走不过去的地面。 删除的时候顺便维护最大的跨度&#xff0c;以此判断可行性。 总的来说利用了答案的单调性。 #include <cstdio> #include <cstring> #include <iostream> #include <…

GPT-3:现实版的“贾维斯”?还是真「人工」智能?

整理 | 章雨铭 责编 | 屠敏出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;GPT-3&#xff08;Generative Pre-trained Transformer 3&#xff09;自2020年推出以来就备受热议&#xff0c;它是一种由OpenAI开发的AI工具。发布的两年来&#xff0c;外媒The Verg…

SVN更换修改用户名

如果装了TortoiseSVN&#xff1a; Settings -> Saved Data -> Authentication Data -> clear。即可清除保存的上个用户登录信息&#xff1b;当再次用到svn时&#xff0c;会提示输入用户名密码&#xff0c;输入新的用户名密码即可。 或者&#xff0c;手动删除下面目录下…

启用CORS实现Ajax跨域请求

2019独角兽企业重金招聘Python工程师标准>>> 应用场景&#xff1a;想从a.com请求b.com上的资源&#xff0c;由于同源策略不允许请求。 解决办法&#xff1a;在请求的php文件中加入 header("Access-Control-Allow-Origin: http://b.com"); 这种比较安全&am…

Python机器学习实践指南pdf (中文版带书签)、原书代码、数据集

Python机器学习实践指南 目 录 第1章Python机器学习的生态系统 1 1&#xff0e;1 数据科学/机器学习的工作 流程 2 1&#xff0e;1&#xff0e;1 获取 2 1&#xff0e;1&#xff0e;2 检查和探索 2 1&#xff0e;1&#xff0e;3 清理和准备 3 1&#xff0e;1&#xff0e;4 建模…

虚拟机安装CentOS以及SecureCRT设置【完美无错版】

一、CentOS简介CentOS是Linux的发行版之一&#xff0c;它安全、稳定、高效&#xff0c;是我最喜欢的Linux发行版之一。CentOS根据Red Hat Enterprise Linux开放源代码编译而成&#xff0c;与RedHat Linux并没有什么本质上的差别。但Red Hat Enterprise Linux是商业软件&#xf…

Python 实现机器学习前后端页面的交互

作者 | 俊欣来源丨关于数据分析与可视化对于机器学习爱好者而言&#xff0c;很多时候我们需要将建好的模型部署在线上&#xff0c;实现前后端的交互&#xff0c;今天小编就通过Flask以及Streamlit这两个框架实现机器学习模型的前后端交互。模型的建立首先是模型的建立&#xff…

webpack入门(二)what is webpack

webpack is a module bundler.webpack是一个模块打包工具&#xff0c;为了解决上篇一提到的各种模块加载或者转换的问题。 webpack takes modules with dependencies and generates static assets representing those modules. webpack以依赖模块和生成 静态的资源来代表这些模…

vSAN读者交流之1-要为不同时间的服务器选择合适的系统版本

近期在我的虚拟化群中&#xff0c;有两个问题比较典型&#xff1a;在比较老的服务器安装新的VMware ESXi 6.7或vCenter Server 6.7出错。在比较新的服务器安装比较旧的ESXi版本5.5出错。因为每个人的实验环境不同、条件不同&#xff0c;用不同的服务器做实验&#xff0c;或者为…

ecshop中ajax的调用原理

1:首先ecshop是如何定义ajax对象的。ecshop中的ajax对象是在js/transport.js文件中定义的。里面是ajax对象文件。声明了一个var Ajax Transport;对象和一个方法Ajax.call Transport.run;2:ecshop中ajax可以使用两种方式传递数据&#xff0e;一种是get方式&#xff0c;一种是p…

IOS7原生API进行二维码条形码的扫描

2019独角兽企业重金招聘Python工程师标准>>> //需要真机 #import "ViewController.h" #import <AVFoundation/AVFoundation.h>interface ViewController ()<AVCaptureMetadataOutputObjectsDelegate>//用于处理采集信息的代理 {AVCaptureSess…