java内存分布及常量池

JVM运行时候的内存区域

JVM初始运行的时候都会分配好Method Area(方法区)Heap(堆),而JVM 每遇到一个线程,就为其分配一个Program Counter Register(程序计数器),VM Stack(虚拟机栈)和Native Method Stack (本地方法栈),当线程终止时,三者(虚拟机栈,本地方法栈和程序计数器)所占用的内存空间也会被释放掉。而线程共享的区域与JAVA程序运行的生命周期相同。

 Java中的常量池,实际上分为两种形态:静态常量池运行时常量池

静态常量池,即*.class文件中的常量池,class文件中的常量池不仅仅包含字符串(数字)字面量,还包含类、方法的信息,占用class文件绝大部分空间。这种常量池主要用于存放两大类常量:字面量(Literal)和符号引用量(Symbolic References),字面量相当于Java语言层面常量的概念,如文本字符串,声明为final的常量值等,符号引用则属于编译原理方面的概念,包括了如下三种类型的常量:类和接口的全限定名;字段名称和描述符;方法名称和描述符。

运行时常量池,则是jvm虚拟机在完成类装载操作后,将class文件中的常量池载入到内存中,并保存在方法区中,我们常说的常量池,就是指方法区中的运行时常量池。

字符串常量

由图可知:

str1==str2 指向同一个堆对象,同时创建了一个常量池引用。

str3 创建了3个堆对象,并且创建了一个常量池引用。

str4 创建了2个堆对象,其中有个对象的value引用另一个的value地址,并未创建常量池引用。

小结:

字面量方式声明,查找常量池有则返回引用。否则,堆里生成对象,同时在在常量池生成引用。如:String s = "xyz";

字面量相+,根据+的结果查找常量池有则返回引用,否则,堆里生成对象,同时在常量池生成引用。如:String s = "a"+"b"; 常量池查找“ab”。最多生成三个对象。

字符串相+,如果有一个不是字面量,则必在堆里生成一个新对象,常量池不生成引用。如:String s=s1+"a";

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  •   需要说明的一点是,这篇文章是以《深入理解Java虚拟机》第二版这本书为基础的,这里假设大家已经了解了JVM的运...
    Geeks_Liu阅读 14,330评论 5 44
  • 这篇文章是我之前翻阅了不少的书籍以及从网络上收集的一些资料的整理,因此不免有一些不准确的地方,同时不同JDK版本的...
    高广超阅读 16,105评论 3 83
  • jvm虚拟内存分布: 程序计数器是jvm执行程序的流水线,存放一些跳转指令。 本地方法栈是jvm调用操作系统方法所...
    dlihasa阅读 1,212评论 0 1
  • 这篇文章解释了Java 虚拟机(JVM)的内部架构。下图显示了遵守Java SE 7 规范的典型的 JVM 核心内...
    饮墨飨书阅读 1,253评论 0 1
  • 一、是什么让人们建立关系? 1.外貌。研究证实,外貌在关系的初期阶段是挺重要的。不过,即使一个人的外貌不是非常符合...
    锐博Reborn阅读 229评论 0 0

友情链接更多精彩内容