java内存区域及静态常量池、运行时常量池介绍
java内存区域介绍
我们先来介绍下虚拟机运行时数据区的结构:
我们项目中的每一个线程在运行时,都会有拥有自己独立的栈数据和程序计数器。程序计数器可以看作字节码命令的指示器,记录了下个需要执行的字节码指令,栈数据主要分为本地方法栈和java虚拟机栈。java虚拟机栈就是用来处理我们程序中代码生成的字节码的。
我们程序中的每个方法在执行时都会被分配给一个虚拟机栈帧,栈帧中包含局部变量表和操作数栈以及返回地址等,用来执行该方法生成的字节码。我们的java程序在编译期间编译器会自动帮我们添加一个默认参数,这个参数就是该方法所属类的引用,也就是我们开发中经常会用的this。this持有方法区中类对象的引用(注意类对象是被放在方法区的,而其他对象都是放在堆中的)。类对象中包含了类的基本信息,包括全限定名、简单名、字段列表、方法列表等等,而这些属性的值全部都被保存在常量池中。常量池又可以分为静态常量池和运行时常量池,接下来我们介绍常量池。
静态常量池和运行时常量池介绍
我们的java程序在编写完成时是以java文件的形式存在的,在完成编译后变成了class文件。如果大家比较了解class文件的话,应该会知道class文件中最重要的是常量池,类的所有属性,包括字段名、方法名等等的值都存储在class文件的常量池中,这里的常量池就是我们所说的静态常量池。这时类属性对class文件常量池中值的引用被称为符号引用,因为这时常量池中的值仍然仅仅是符号,不是具体的内存地址。符号引用到内存地址引用的转换要到运行期才会发生,所以我们称java程序是动态链接的。
当我们class文件被加载到内存中时,内存中同样存在一个常量池,这个常量池我们通常称为运行时常量池。但是这里的运行时常量池仅仅是一个泛称,而并不是说有这么一个大池子,实际上运行时常量池是字符串常量池、数字类型常量池等数据结构的统称。这里我们以字符串常量池举个?来说明静态常量池到运行时常量池的转变过程。虚拟机在将class文件加载到内存的过程中会先到class文件的常量池中寻找字符串类型的常量数据,找到后到内存中的运行时字符串常量池中寻找是否有相同的字符,若没有就在堆中创建一个字符串对象,并且在字符串常量池添加这个字符串的引用,同时也会将class中所有原本的引用全部都改成新的引用。字符串常量的使用能够大幅度的提升对象的利用率,减少程序中不必要的开销。
java内存区域及静态常量池、运行时常量池介绍相关推荐
- JVM常量池最全详解-常量池/运行时常量池/字符串常量池/基本类型常量池,看这一篇就够了
JVM常量池最全详解-常量池/运行时常量池/字符串常量池/基本类型常量池,看这一篇就够了! 常量池详解 1. 字面量和符号引用 1.1 字面量 1.2 符号引用 2. 常量池vs运行时常量池 3. 常 ...
- Java中几种常量池(字符串常量池, Class常量池, 运行时常量池)的区别与联系
简介: 这几天在看Java虚拟机方面的知识时,看到了有几种不同常量池的说法,然后我就去CSDN.博客园等上找资料,里面说的内容真是百花齐放,各自争艳,因此,我好好整理了一下,将我自认为对的理解写下来与 ...
- JVM - Class常量池 || 运行时常量池
文章目录 Pre class常量池 字面量 符号引用 运行时常量池 Pre JVM - 深入剖析字符串常量池 JVM - 基本类型的包装类和对象池 class常量池 Class常量池我们可以理解为是C ...
- 02.字符串常量池 ? class常量池? 运行时常量池?
java对象创建流程: 简介: 这几天在看Java虚拟机方面的知识时,看到了有几种不同常量池的说法,然后我就去CSDN.博客园等上找资料,里面说的内容真是百花齐放,各自争艳,因此,我好好整理了一下,将 ...
- java 内存情况_Java代码中获取运行时内存情况
在此之前,还是先看下JVM内存结构和JVM参数调优,网上太多不说也罢. 另外提醒的是方法反映的都是java这个进程的内存情况,跟操作系统的内存根本没有关系. public class Test { p ...
- 深入理解Java虚拟机(第3版)学习笔记——JAVA内存区域(超详细)
深入理解Java虚拟机(第3版)学习笔记--JAVA内存区域(超详细) 运行时数据区域 程序计数器 java虚拟机栈 本地方法栈 java堆 方法区 运行时常量池 直接内存 对象的创建 对象的内存布局 ...
- Java内存区域(运行时数据区域)和内存模型(JMM)
原文作者:czwbig 原文:https://www.cnblogs.com/czwbig/p/11127124.html Java 内存区域和内存模型是不一样的东西,内存区域是指 Jvm 运行时将数 ...
- jvm中方法区和常量池详解_Java常量池(静态常量池与运行时常量池)
1.什么是常量 用final修饰的成员变量表示常量,值一旦给定就无法改变! final修饰的变量有三种:静态变量.实例变量和局部变量,分别表示三种类型的常量. Java中的常量池,实际上分为两种形态: ...
- JVM 内存模型:运行时常量池
1. 前言 最近研究Java基础知识.发现Java运行时常量池和String字符串有些一些细节的地方,值得我们注意的地方,最为一个Java开发人员对于这种java基本特性和JVM虚拟机的内存模型我们需 ...
最新文章
- 中文微博客的热门锐推用户榜
- python装饰器作用-python中装饰器的作用
- 数字数据fzu 2120 数字排列
- 抽奖算法-指定概率的随机
- (第四篇)Vue生命周期
- linux nginx postgresql php,常用Web环境架设手册PNP:Postgresql+Nginx+PHP
- 多台tomcat服务的session共享 memcached与redis
- CV Code | 计算机视觉开源周报 20190604期
- 蓝桥杯 算法训练 数字三角形
- python对excel数据分析常用功能(一文学会如何用Python实现excel基础功能)
- 经典按键java手机游戏_菜鸟也能轻松吃鸡的神器——莱仕达P30S手机游戏手柄体验...
- ios 旋转屏幕试图切换_iOS播放器横竖屏切换的实现
- 微软人工智能公开课.md
- 如何在Tomcat中发布网站
- 第85节:Java中的JavaScript
- 各大电商历史价格json后端接口
- vnc连接linux使用教程_远程管理之VNC 详解
- 浅析“高内聚,低耦合”
- Mac中如何通过terminal命令行进入“iCloud Driver”目录
- Java中split方法详细讲解