java内存区域介绍

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

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

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

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

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

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

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

  1. JVM常量池最全详解-常量池/运行时常量池/字符串常量池/基本类型常量池,看这一篇就够了

    JVM常量池最全详解-常量池/运行时常量池/字符串常量池/基本类型常量池,看这一篇就够了! 常量池详解 1. 字面量和符号引用 1.1 字面量 1.2 符号引用 2. 常量池vs运行时常量池 3. 常 ...

  2. Java中几种常量池(字符串常量池, Class常量池, 运行时常量池)的区别与联系

    简介: 这几天在看Java虚拟机方面的知识时,看到了有几种不同常量池的说法,然后我就去CSDN.博客园等上找资料,里面说的内容真是百花齐放,各自争艳,因此,我好好整理了一下,将我自认为对的理解写下来与 ...

  3. JVM - Class常量池 || 运行时常量池

    文章目录 Pre class常量池 字面量 符号引用 运行时常量池 Pre JVM - 深入剖析字符串常量池 JVM - 基本类型的包装类和对象池 class常量池 Class常量池我们可以理解为是C ...

  4. 02.字符串常量池 ? class常量池? 运行时常量池?

    java对象创建流程: 简介: 这几天在看Java虚拟机方面的知识时,看到了有几种不同常量池的说法,然后我就去CSDN.博客园等上找资料,里面说的内容真是百花齐放,各自争艳,因此,我好好整理了一下,将 ...

  5. java 内存情况_Java代码中获取运行时内存情况

    在此之前,还是先看下JVM内存结构和JVM参数调优,网上太多不说也罢. 另外提醒的是方法反映的都是java这个进程的内存情况,跟操作系统的内存根本没有关系. public class Test { p ...

  6. 深入理解Java虚拟机(第3版)学习笔记——JAVA内存区域(超详细)

    深入理解Java虚拟机(第3版)学习笔记--JAVA内存区域(超详细) 运行时数据区域 程序计数器 java虚拟机栈 本地方法栈 java堆 方法区 运行时常量池 直接内存 对象的创建 对象的内存布局 ...

  7. Java内存区域(运行时数据区域)和内存模型(JMM)

    原文作者:czwbig 原文:https://www.cnblogs.com/czwbig/p/11127124.html Java 内存区域和内存模型是不一样的东西,内存区域是指 Jvm 运行时将数 ...

  8. jvm中方法区和常量池详解_Java常量池(静态常量池与运行时常量池)

    1.什么是常量 用final修饰的成员变量表示常量,值一旦给定就无法改变! final修饰的变量有三种:静态变量.实例变量和局部变量,分别表示三种类型的常量. Java中的常量池,实际上分为两种形态: ...

  9. JVM 内存模型:运行时常量池

    1. 前言 最近研究Java基础知识.发现Java运行时常量池和String字符串有些一些细节的地方,值得我们注意的地方,最为一个Java开发人员对于这种java基本特性和JVM虚拟机的内存模型我们需 ...

最新文章

  1. 中文微博客的热门锐推用户榜
  2. python装饰器作用-python中装饰器的作用
  3. 数字数据fzu 2120 数字排列
  4. 抽奖算法-指定概率的随机
  5. (第四篇)Vue生命周期
  6. linux nginx postgresql php,常用Web环境架设手册PNP:Postgresql+Nginx+PHP
  7. 多台tomcat服务的session共享 memcached与redis
  8. CV Code | 计算机视觉开源周报 20190604期
  9. 蓝桥杯 算法训练 数字三角形
  10. python对excel数据分析常用功能(一文学会如何用Python实现excel基础功能)
  11. 经典按键java手机游戏_菜鸟也能轻松吃鸡的神器——莱仕达P30S手机游戏手柄体验...
  12. ios 旋转屏幕试图切换_iOS播放器横竖屏切换的实现
  13. 微软人工智能公开课.md
  14. 如何在Tomcat中发布网站
  15. 第85节:Java中的JavaScript
  16. 各大电商历史价格json后端接口
  17. vnc连接linux使用教程_远程管理之VNC 详解
  18. 浅析“高内聚,低耦合”
  19. Mac中如何通过terminal命令行进入“iCloud Driver”目录
  20. Java中split方法详细讲解

热门文章

  1. 永远和靠谱的人在一起!
  2. linux多线程 pthread用法
  3. referer参数和addslashes()函数的骚路子
  4. EcmaScript对象克隆之谜
  5. 推荐一个接口文档工具
  6. 浅谈Java中的hashcode方法
  7. Loading 遮蔽层 简单实现。
  8. sharepoint 2007页面显示真实的错误信息
  9. (转)动态Entity Framework查询:Dynamic Query 介绍
  10. 算法导论13-1节习题解答