美文网首页java 进阶
深入理解JVM--常量池

深入理解JVM--常量池

作者: _zhaoyan_ | 来源:发表于2019-08-27 17:19 被阅读0次

概述

(1)运行时常量池属于方法区的一块内存
(2)用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载后进入方法区的运行时常量池中存放。

根据jvm内存区域分布,我们知道
(1)java栈(虚拟机栈)是用于存储局部变量表,操作栈,动态链接,方法出口等信息。(方法执行的时候)
(2)堆:所有对象实例及数组都要在堆上分配内存;

详解

图例:


image.png

如图所示,定义a1和a2的时候,在堆中应该创建两个地址,分别用存放两个abc,因此我们用==判断地址是否相等的时候应该返回false;

String a1 = "abc";
String a2 = "abc";
System.out.println(a1==a2);
//true or false ?
运行结果如下: bA.gif

我们发现运行结果是true,由此可知,abc有另外的一块存储位置;
如下图,我们可以假象,有这样的一块结构在方法区,有一块类似hashset的数据结构,创建一个字符创就会在常量池中创建一个,hashset集合无序不重复,在a1存入的时候,在常量池生成abc,a2进来的时候,现在常量池中查找,是否存在abc,存在的话,直接指向,不存在新建对象;


image.png
String a1 = "abc";
String a3 = new String("abc");
System.out.println(a1==a3);
//true or false ?
运行结果如下: cc.gif

而直接new 创建对象,值一定是在堆内存中,


image.png
如上图所示a3和a1并不是一块内存空间,因此返回的是false;
System.out.println(a1 == a3.intern());
//true or false

扩展

intern()方法就是把a3的值取到,丢到常量池里面,产生运行时常量,这样a3.intern()取到的值就是常量池中的值,a1==a3 返回返回true;
直接内存:

相关文章

  • 深入理解JVM--常量池

    概述 (1)运行时常量池属于方法区的一块内存(2)用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载后...

  • String整理

    浅谈StringBuilder - 简书理解Java常量池 - gegewx - 博客园通过反编译深入理解Java...

  • java基础类型、String类理解、版本对比、1.8新特性

    1、java基本数据类型及长度 2、jvm的常量池: JVM常量池浅析Java常量池理解与总结 Java中的常量池...

  • String.intern()、String、StringBui

    1. String.intern() 看《深入理解Java虚拟机》提到运行时常量池(Runtime Constan...

  • Java常量池

    理解一下Java常量池

  • 字符串常量池

    静态常量池,运行期常量池,字符串常量池 静态常量池 运行时常量池 字符串常量池 问题 结果: 验证new Stri...

  • java__常量池

    java的常量池分为两种型态:静态常量池和运行常量池 静态常量池: 即class文件中的常量池,这种常量池主要用于...

  • JVM-常量池

    JVM-常量池 JVM常量池分为 Class文件常量池 运行时常量池 全局字符串常量池 基本类型包装类对象常量池 ...

  • 细说Java常量池

      Java中的常量池有:class常量池、运行时常量池、String常量池。 为什么要使用常量池?   避免频繁...

  • Java 内存—常量池

    Java中的常量池分为两种型态: 静态常量池 运行时常量池 静态常量池 所谓静态常量池是指class文件中的常量池...

网友评论

    本文标题:深入理解JVM--常量池

    本文链接:https://www.haomeiwen.com/subject/glisectx.html