1.运行时常量池属于线程共享区中的方法区。

2.运行时常量池用于编译期生成的各种自变量,符号引用,这部分内用将在类加载后接入方法区的运行时常量池中存放。

看如下代码所示,如图:

public class Test {
public static void main(String[] args) {
String s1 = "abc";
String s2 = "abc"; String s3 = new String("abc");
System.out.println(s1 == s2);
System.out.println(s1 == s3);
}
}

很明显s1 == s2为true,而s1 == s3为false。

因为基本数据类型和抽象数据类的引用是放在栈帧的局部变量表中。所以s1 s2是放在栈帧的局部变量表中。而“abc”这个对象则是放在运行时常量池中。

而这个常量池有钟数据结构叫Stringtable,它的数据类型可以理解为HashSet。而HashSet是无序的,不可重复的。因此第一次将定义的“abc"放入其中

而第二次定义中发现常量池中有“abc”了,则不再创建“abc"了,此时s1 和s2则引用的是同一个”abc“。因此s1 == s2为true。

而s3则是通过new出来的实例,则放进java堆中,此时s3引用的是堆中的”abc"。因此s1 == s3为false。

如果将s3变动一下又会产生什么结果呢?如下代码所示:

public class Test {
public static void main(String[] args) {
String s1 = "abc";
String s2 = "abc"; String s3 = new String("abc");
System.out.println(s1 == s2);
System.out.println(s1 == s3);
System.out.println(s1 == s3.intern());
}
}

很明显System.out.println(s1 == s3.intern());为true。因为s3.intern()是将堆中的“abc"拿出来放进常量池中,而常量池中已经存在”abc“,因此直接把常量池中的

”abc"引用给了s3,因此System.out.println(s1 == s3.intern());为true,这就形成了运行时常量。

注意当常量池中满了同样会抛出OutOfMemory内存溢出异常。

这里顺便提提一个叫做直接内存

直接内存:并不是虚拟机运行时数据区的的一部分。当然了,这也不是虚拟机规范中定义的内存 区域。而是一种对外的内存区域。

NIO正是经常用到了对外内存。同样当对外内存满了也照样会抛出OutOfMemory内存溢出异常。抛出这种异常也要考虑一下这个区域。

JVM笔记3-java内存区域之运行时常量池的更多相关文章

  1. Java内存区域(运行时数据区域)详解、JDK1.8与JDK1.7的区别

    2.1 概述 对Java程序员来说,在虚拟机自动内存管理机制的帮助下,不再需要为每个对象的new操作去写配对的delete/free 代码,不容易出现内存泄露和内存溢出的问题.不过,仍然需要Java虚 ...

  2. 介绍下Java内存区域(运行时数据区)

    介绍下Java内存区域(运行时数据区) Java 虚拟机在执行 Java 程序的过程中会把它管理的内存划分成若干个不同的数据区域.JDK 1.8 和之前的版本略有不同. 下图是 JDK 1.8 对JV ...

  3. 翻译:JVM虚拟机规范1.7中的运行时常量池部分(二)

    本篇为JVM虚拟机规范1.7中的运行时常量池部分系列的第二篇. 4.4.4. The CONSTANT_Integer_info and CONSTANT_Float_info Structures ...

  4. JVM笔记(一) Java内存区域

    Java 内存区域 总概 java虚拟机在执行java程序的过程中,会把它管理的内存划分为几个不同的数据区域.每当运行一个java程序时,就会启动一个虚拟机. 具体的区域如图所示: 同时,方法区 与 ...

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

    Java 内存区域和内存模型是不一样的东西,内存区域是指 Jvm 运行时将数据分区域存储,强调对内存空间的划分. 而内存模型(Java Memory Model,简称 JMM )是定义了线程和主内存之 ...

  6. 翻译:JVM虚拟机规范1.7中的运行时常量池部分(一)

    原文链接: https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.4 Java Virtual Machine i ...

  7. 翻译:JVM虚拟机规范1.7中的运行时常量池部分(三)

    4.4.7. The CONSTANT_Utf8_info Structure The CONSTANT_Utf8_info structure is used to represent consta ...

  8. 【搞定Jvm面试】 Java 内存区域揭秘附常见面试题解析

    本文已经收录自笔者开源的 JavaGuide: https://github.com/Snailclimb ([Java学习+面试指南] 一份涵盖大部分Java程序员所需要掌握的核心知识)如果觉得不错 ...

  9. JVM探究之 —— Java内存区域

    1. 概述 对于从事C.C++程序开发的开发人员来说,在内存管理领域,他们既是拥有最高权力的“皇帝”又是从事最基础工作的“劳动人民”——既拥有每一个对象的“所有权”,又担负着每一个对象生命开始到终结的 ...

随机推荐

  1. Asp.net core 2.0.1 Razor 的使用学习笔记(一)

    环境:vs2017 版本:15.5.6 一.新建项目 1.文件>新建>项目>Visual c#>.NET Core>ASP.NET Core Web应用程序(“.NET ...

  2. java 中的instanceof

    java 中的instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例.instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例. 用法:resu ...

  3. Eclipse运行Java简单实例

    运行eclipse前首先配置好JDK环境变量等  双击这句话可跳转配置环境变量详细步骤 运行eclipse软件 1.File菜单-New - project 2.Java Project - Next ...

  4. 6 个 Linux 运维典型问题

    作为一名合格的 Linux 运维工程师,一定要有一套清晰.明确的解决故障思路,当问题出现时,才能迅速定位.解决问题,这里给出一个处理问题的一般思路: 重视报错提示信息:每个错误的出现,都是给出错误提示 ...

  5. [js] 如何 在 jQuery 中的 $.each 循环中使用 break 和 continue

    jQuery中each类似于javascript的for循环 但不同于for循环的是在each里面不能使用break结束循环,也不能使用continue来结束本次循环,想要实现类似的功能就只能用ret ...

  6. React-Native 系列视频失效补链及一些碎碎念

    最近很多朋友联系我要视频链接,说失效了,这边补一下链接,时间问题就不一篇一篇修改了: 链接:https://pan.baidu.com/s/1mj5Cak4 密码:wiq2 注:视频还是建议参考,因为 ...

  7. 一个特殊的List去重问题的解决方案

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/7039842.html 场景描述:公司新活动,需要在活动页面显示指定利率的四种投资项目,并且 ...

  8. Django中模板的用法简介

    1. 模板系统的介绍 Django作为一个Web框架,其模板所需的HTML输出静态部分以及动态内容插入 模板由HTML代码和逻辑控制代码构成 Django框架的模板语言的语法格式: {{var_nam ...

  9. ConcurrentHashMap、CopyOnWriteArrayList、LinkedHashMap

    HashMap中未进行同步考虑,而Hashtable在每个方法上加上了synchronized,锁住了整个Hash表,一个时刻只能有一个线程操作,其他的线程则只能等待,在并发的环境下,这样的操作导致H ...

  10. 使用.bat来执行Java程序基础

    将java程序做成可运行的jar后,又希望使用.bat文件来调用jar时,有几点需要注意的. 1.设置path和classpath .bat文件中扥的内容如下: @echo off set MY_HO ...