java内存区域及静态常量池、运行时常量池介绍

java内存区域介绍

我们先来介绍下虚拟机运行时数据区的结构:

我们项目中的每一个线程在运行时,都会有拥有自己独立的栈数据和程序计数器。程序计数器可以看作字节码命令的指示器,记录了下个需要执行的字节码指令,栈数据主要分为本地方法栈和java虚拟机栈。java虚拟机栈就是用来处理我们程序中代码生成的字节码的。

我们程序中的每个方法在执行时都会被分配给一个虚拟机栈帧,栈帧中包含局部变量表和操作数栈以及返回地址等,用来执行该方法生成的字节码。我们的java程序在编译期间编译器会自动帮我们添加一个默认参数,这个参数就是该方法所属类的引用,也就是我们开发中经常会用的this。this持有方法区中类对象的引用(注意类对象是被放在方法区的,而其他对象都是放在堆中的)。类对象中包含了类的基本信息,包括全限定名、简单名、字段列表、方法列表等等,而这些属性的值全部都被保存在常量池中。常量池又可以分为静态常量池和运行时常量池,接下来我们介绍常量池。

静态常量池和运行时常量池介绍

我们的java程序在编写完成时是以java文件的形式存在的,在完成编译后变成了class文件。如果大家比较了解class文件的话,应该会知道class文件中最重要的是常量池,类的所有属性,包括字段名、方法名等等的值都存储在class文件的常量池中,这里的常量池就是我们所说的静态常量池。这时类属性对class文件常量池中值的引用被称为符号引用,因为这时常量池中的值仍然仅仅是符号,不是具体的内存地址。符号引用到内存地址引用的转换要到运行期才会发生,所以我们称java程序是动态链接的。

当我们class文件被加载到内存中时,内存中同样存在一个常量池,这个常量池我们通常称为运行时常量池。但是这里的运行时常量池仅仅是一个泛称,而并不是说有这么一个大池子,实际上运行时常量池是字符串常量池、数字类型常量池等数据结构的统称。这里我们以字符串常量池举个?来说明静态常量池到运行时常量池的转变过程。虚拟机在将class文件加载到内存的过程中会先到class文件的常量池中寻找字符串类型的常量数据,找到后到内存中的运行时字符串常量池中寻找是否有相同的字符,若没有就在堆中创建一个字符串对象,并且在字符串常量池添加这个字符串的引用,同时也会将class中所有原本的引用全部都改成新的引用。字符串常量的使用能够大幅度的提升对象的利用率,减少程序中不必要的开销。

 

 

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

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

相关文章

狗窝里的小日子- 6 ...

来,把平时作的菜菜整理下: 61. 62. 63. 64. 65. 66. 67. 68. 69. 70.

数据库常见面试题总结

参考如下: 数据库常见面试题(开发者篇) 数据库优化 SQL数据库面试题及答案 常见面试题整理--数据库篇转载于:https://www.cnblogs.com/threetop/p/9425172.html

京东商城上市带来的利与益

有人说2012是大选年,而对于互联网行业来说,不如说是上市年。继全球第一的社交网站Facebook上市之后,中国最大的电子商城京东商城也要紧锣密鼓的进行IPO了。笔者不分析京东IPO对电商行业的影响、不分析京东后IPO那些二三线电商怎么着急、不谈电…

狗窝里的小日子- 7 ...

来,把平时作的菜菜整理下: 71. 72. 73. 74. 75. 76. 77. 78. 79. 80.

[转]CNN目标检测(一):Faster RCNN详解

https://blog.csdn.net/a8039974/article/details/77592389 Faster RCNN github : https://github.com/rbgirshick/py-faster-rcnn Faster RCNN paper : https://arxiv.org/abs/1506.01497 Bound box regression详解 : http://download.csdn.net/download/zy1034092330/9940097…

Class.forName和ClassLoader

(1)ClassLoader是用来加载类数据的(加载的方式由具体的加载器决定)。类加载器根据类的全限定名加载类的二进制字节流,然后将字节流转换成jvm方法区中的运行时数据结构,并在方法区生成一个代表该类的Class对…

狗窝里的小日子- 8 ...

来,把平时作的菜菜整理下: 81. 82. 83. 84. 85. 86. 87. 88.

PHPSTORM破解版激活方式方法

方法一. 通过Licence Server 激活PHPStorm(快速)方法原理是通过搭建服务器激活,不过网上有许多搭建好的。http://idea.goxz.gqhttp://v2mc.net:1017http://idea.imsxm.com(2016版)http://idea.ibdyr.com注:不一定长期有…

BZOJ1911 特别行动队

目录 BZOJ1911 特别行动队题解codeBZOJ1911 特别行动队 题目传送门 题解 典型的斜率优化\(Dp\)。首先如果我们记\(sum[i]\)表示前\(i\)个士兵的战斗力之和,那么我们比较容易的可以得出\(O(n^2)\)的\(Dp\):\…

硅谷创业者中被遮蔽的“中国现象”

摘要:他们关心互联网和移动,但更关心公共设施的信息化、环境污染和气候变暖、清洁能源的利用,以及农业和食物的改良。但至少目前看上去,他们赢得的来自硅谷的学术机构、风险投资界的认可与尊敬,似乎要更多。 他们关心互…

【模式识别与机器学习】——3.9势函数法:一种确定性的非线性分类方法

目的 用势函数的概念来确定判别函数和划分类别界面。 基本思想 假设要划分属于两种类别ω1和ω2的模式样本,这些样本可看成是分布在n维模式空间中的点xk。 把属于ω1的点比拟为某种能源点,在点上,电位达到峰值。 随着与该点距离的增大&a…

超详细 - SVN下载安装及使用教程

SVN简介: 为什么要使用SVN? 程序员在编写程序的过程中,每个程序员都会生成很多不同的版本,这就需要程序员有效的管理代码,在需要的时候可以迅速,准确取出相应的版本。 Subversion是什么? 它是一…

TW实习日记:第16天

前端的样式bug实在是太太太莫名其妙了,尤其是封装好的组件,一层套一层的,根本不知道是哪一层出了问题...除了改bug就是做新功能,真想吐槽一下这个项目的留言板,根本没人会用吧...这功能实在是太老旧了... 感觉每一天都…

重载与重写(overload and override)

在java编程中经常会遇到重载和重写,刚接触java的时候对这对概念比较懵比,也不能理解其中的区别,后来在逐渐的学习中更加深刻的理解了其中的原理。哎,说来还是基础知识学的不扎实,这些都是大学期间偷懒欠下的帐。 &…

洛谷P4114 Qtree1(树链剖分+线段树)

传送门 LCT秒天秒地用什么树剖 这题可以算是树剖的比较裸的题目了 把每一条边的权值下放到他两边的点中深度较深的那个 然后直接用树剖线段树带进去乱搞就可以了 1 //minamoto2 #include<bits/stdc.h>3 using namespace std;4 template<class T>inline bool cmax(T…

什么是CDN ,CDN的作用

转自&#xff1a;https://baike.baidu.com/item/CDN/420951?fraladdin 简介 CDN是构建在网络之上的内容分发网络&#xff0c;依靠部署在各地的边缘服务器&#xff0c;通过中心平台的负载均衡、内容分发、调度等功能模块&#xff0c;使用户就近获取所需内容&#xff0c;降低网…

docker 中不能用vim编辑文件

2019独角兽企业重金招聘Python工程师标准>>> docker 中不能用vim编辑文件 2017年08月28日 16:54:29 阅读数&#xff1a;2061 更新来源 apt-get update 1安装vim apt-get install -y vim 转载于:https://my.oschina.net/u/3367404/blog/1923901

使用final修饰局部变量???

在编程中我们偶尔会看到如下的代码&#xff1a; public void foo(final int arg){final int localData 0;// ...}以及与之相似的代码 public void foo(int arg){int localData 0;// ...}这两段代码的主要区别就是&#xff1a;局部变量是否使用了final关键字修饰。有同学可能会…

视频编解码概述

视频编解码概述 1. 常用的基本知识 基本概念 编解码 编解码器&#xff08;codec&#xff09;指的是一个能够对一个信号或者一个数据流进行变换的设备或者程序。这里指的变换既包括将信号或者数据流进行编码&#xff08;通常是为了传输、存储或者加密&#xff09;或者提取得到…

洛谷 2759 奇怪的函数

【题解】 取个对数然后二分即可。对于一个数x&#xff0c;x^x的位数就是(int)(lg(x)*x1). 1 #include<cstdio>2 #include<cstring>3 #include<algorithm>4 #include<cmath>5 #define LL long long6 #define rg register7 #define N 2000108 using name…