PS : 之前好像忘记说了,整个 走进 JDK 专栏都是基于 java 1.8 源码进行分析的。关于其他版本的差异,可能会提到,但是不会细说。所有添加注释的代码都上传到我的 Github 了,传送门
知道了常量池的位置后,然后让我们来揭秘常量池里究竟有什么东西吧~
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://louluan.blog.csdn.net/article/details/39960815
接上一篇博客 【Java 虚拟机原理】Class 字节码二进制文件分析 一 ( 字节码文件附加信息 | 魔数 | 次版本号 | 主版本号 | 常量池个数 ) ;
要是没有实践过别人书本上的理论的话,就还是会说常量池在方法区里面,要是知道方法区已经随jdk升级,被逐步干掉的话,额,也不能说被干掉,只是被优化了,这又体现了看书的程度深浅了,就会看到有的文章说常量池移动到heap堆里面了,还有极少的说移动到Metaspace里面了,产生了分歧。这个时候就需要实践出真知了。
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://louluan.blog.csdn.net/article/details/40148053
常量表示程序运行过程种不可改变的值,主要作用如下: 1.代表常数,便于程序的重构和修改。 2.增加程序的可读性。 在java中,常量的语法格式只需要在变量前添加final即可。代码规范要求常量名称须用大写字母。 如:
java常量池是一个经久不衰的话题,也是面试官的最爱,题目花样百出,这次好好总结一下。
⚠️全局字符串池里的内容是在类加载完成,经过验证、准备阶段之后在堆中生成字符串对象实例,然后将该字符串对象实例的引用值存到中;中存的是引用值而不是具体的实例对象,具体的实例对象是在堆中开辟的一块空间存放的。
class文件是一组以字节为单位的二进制数据流,在java代码的编译期间,我们编写的java文件就被编译为.class文件格式的二进制数据存放在磁盘中,其中就包括class文件常量池。 class文件中存在常量池(非运行时常量池),其在编译阶段就已经确定,jvm规范对class文件结构有着严格的规范,必须符合此规范的class文件才能被jvm任何和装载。为了方便说明,我们写个简单的类
JVM常量池主要分为Class文件常量池、运行时常量池,全局字符串常量池,以及基本类型包装类对象常量池。
在Java虚拟机jvm中,内存分布为:虚拟机堆,程序计数器,本地方法栈,虚拟机栈,方法区。
运行时常量池(Runtime Constant Pool)是 Java 虚拟机中的一块内存区域,用于存储类文件中的常量数据以及符号引用。
作者 | GuoMell 来源 | blog.csdn.net/gcoder_/article/details/106644312 0. Background 在 JAVA 语言中有8中基本类型和一种比较特殊的类型String。这些类型为了使他们在运行过程中速度更快,更节省内存,都提供了一种常量池的概念。常量池就类似一个JAVA系统级别提供的缓存。 8种基本类型的常量池都是系统协调的,String类型的常量池比较特殊。它的主要使用方法有两种: 直接使用双引号声明出来的String对象会直接存储在常量池中。
字符串池与常量池是完全不同的两个东西,但是很多地方都喜欢把它们混为一谈,很容易让初学者产生误解,在这里我想好好讨论一下它们。
来源:blog.csdn.net/gcoder_/article/details/106644312
运行时常量池是方法区(PermGen)的一部分。 需要提前了解: 1. JVM内存模型。 2. JAVA对象在JVM中内存分配 常量池的好处 常量池是为了避免频繁的创建和销毁对象而影响系统性能,其实现了对象的共享。 Java的自动装箱中其实就使用到了运行时常量池。详见:Java 自动装箱与拆箱的实现原理 还有字符串常量池。 字符串进入到常量池的两种方法: 1. new String()的实例调用intern()方法。 执行intern()方法时,若常量池中不存在等值的字符串,JVM就会在常
class文件是以字节为单位的二进制数据流,java编译器将java源码文件编译成.class字节码文件存放在磁盘上,.class中就包含文件常量池(非运行时常量池),在编译期间就确定了,.class文件遵循jvm虚拟机规范.
上一篇博客 【Java 虚拟机原理】Class 字节码二进制文件分析 二 ( 常量池位置 | 常量池结构 | tag | info[] | 完整分析字节码文件中的常量池二进制数据 ) ;
大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说Java常量池(静态常量池与运行时常量池)[通俗易懂],希望能够帮助大家进步!!!
目录: 1.常量池与Class常量池 2.运行时常量池 运行时常量池的简介 方法区的Class文件信息,Class常量池和运行时常量池的三者关系 3.字符串常量池 字符串常量池的简介 采用字面值的方式创建字符串对象 采用new关键字新建一个字符串对象 字符串池的优缺点 4.字符串常量池和运行时常量池之间的藕断丝连 常量池和字符串常量池的版本变化 String.intern在JDK6和JDK7之后的区别(重难点) 字符串常量池里存放的是引用还是字面量
在Java虚拟机(JVM)中,每个类都有一个与之对应的字节码文件。字节码文件包含了一系列指令,用于执行Java程序。而字节码中的常量池则是其中的一个重要组成部分。
在网上看了很多博客,解释也比较多,关于字符串常量池的具体位置难以分辨谁真谁假。
对于每个加载的类型(class、interface、enum、annotation)JVM 必须在方法区中存储一下类型信息。
ThreadLocal:如何保证多个线程在并发环境下的安全性?典型应用就是数据库连接管理,以及独立会话管理
上篇介绍了一些String的基础与简单的创建方式,本篇引入它的intern()方法。
Java源代码文件(.java后缀)会被Java编译器编译为字节码文件(.class后缀),然后由JVM中的类加载器加载各个类的字节码文件,加载完毕之后,交由JVM执行引擎执行。
我想所有 Java 程序员都曾被这个 new String 的问题困扰过,这是一道高频的 Java 面试题,但可惜的是网上众说纷纭,竟然找不到标准的答案。有人说创建了 1 个对象,也有人说创建了 2 个对象,还有人说可能创建了 1 个或 2 个对象,但谁都没有拿出干掉对方的证据,这就让我们这帮吃瓜群众们陷入了两难之中,不知道到底该信谁得。
字符串对象:比如new String(“abc”),或者直接String s=”str”,后面的”str”也是一个字符串对象。
这几天在看Java虚拟机方面的知识时,看到了有几种不同常量池的说法,然后我就去CSDN、博客园等上找资料,里面说的内容真是百花齐放,各自争艳,因此,我好好整理了一下,将我自认为对的理解写下来与大家共同探讨:
首先要明确,JVM规范中并没有常量池这一说法,都是各种不同的jvm实现为了便于处理加以区分的。在JVM规范中统一称呼为方法区(JDK7之后这样说也不准确,有些数据常量数据又迁移到堆中)。下面的常量池主要以Java8自带的HotSpot为例,其他版本的Jvm会有各种区别。在HotSpot中,JDK6之前的版本所有常量池都在永生代(permanent generation)中,而JDK8取消了永生带用元空间(metaspace)替换,可以简单的理解常量池被移动到元空间中了(但实际处理还是有很多差异,大部分以前放置在永生代数据被迁移到堆中,而元数据区仅存放引用。但是这样说便于理解)。JDK7是一个过渡版本,只是将字符串移动到堆中。
Java虚拟机内存区域 Java程序在JVM虚拟机中运行,当我们一个类被加载到虚拟机中时,JVM会给该类分配具体的内存空间/内存地址,而这被分配的区域就是Java虚拟机运行时内存区域。那么,该片区域到底有什么,又可以做什么,接下来就来一一解答。 在讨论JVM内存区域划分之前,先来看一下Java程序具体执行的过程: 首先是我们的编写的Java源代码文件---xxx.java,该文件会被Java编译器编译成字节码文件---xxx.class,然后Java虚拟机开始启动,Java虚拟机通过类加载器加载xxx.cl
常量池(Constant Pool),也叫 class 常量池(Class Constant Pool)。
字符串常量池是 Java 中的一种特殊的内存区域,用于存储字符串常量。它是在编译阶段就确定并存储的,是一种优化机制,可以减少内存的占用和提高程序的执行效率。
JDK1.8-1.9,String底层从char数组变成了byte数组,原因是部分字符仅占一个byte,而堆中含有大量的String字符串,该优化能节省较多空间。
When---什么时候需要了解String的intern方法: 面试的时候(蜜汁尴尬)!虽然不想承认,不过面试的时候经常碰到这种高逼格的问题来考察我们是否真正理解了String的不可变性、String常量池的设计以及String.intern方法所做的事情。但其实,我们在实际的编程中也可能碰到可以利用String.intern方法来提高程序效率或者减少内存占用的情况,这个我们等下会细说。 What---String.intern方法究竟做了什么: Returns a canonical representa
先将示例代码编译为 *.class 文件,然后将class文件反编译为JVM指令码。然后观察 *.class字节码中到底包含了哪些部分。
面试的时候经常被问到String的intern方法的调用及内存结构发生的变化。但在实际生产中真正用到过了吗,看到过别人如何使用了吗?
我们知道字符串的分配和其他对象分配一样,是需要消耗高昂的时间和空间的,而且字符串我们使用的非常多。JVM为了提高性能和减少内存的开销,在实例化字符串的时候进行了一些优化:使用字符串常量池。
String,是Java中除了基本数据类型以外,最为重要的一个类型了。很多人会认为他比较简单。但是和String有关的面试题有很多,下面我随便找两道面试题,看看你能不能都答对:
还记得 Java八种基本数据类型及对应包装类、四种引用类型吗?如果忘记可以到这里重温复习Java数据类型(八种基本数据类型 + 四种引用类型)、数据类型转换
写技术文章其实是个很好的学习方式。首先你得自己摸清楚原理,然后才能尝试去表达出来。你写出来的东西,别人看了,给予你反馈,也是一个互相学习的过程。这不,前几天碰到一个读者提出的一个问题,让我发现了自己文章中的一个疏漏,下面就来说说这个问题。
String 是日常开发非常频繁的类,此外我们常用的操作还有字符串连接操作符等等。String对象是不可变的,查看JDK文档,我们不难发现String类的每个修改值的方法,其实都是创建了一个新的String对象,以包含修改后的字符串内容。
关于String以及StringBuffer、StringBuilder的相关信息可以参考博主的另一篇文章:
昨天,我花了很长时间完善了一下 JavaGuide 上 JVM 部分方法区的相关介绍。
字符串常量池是 Java 中的一块特殊内存区域,用于存储字符串对象。在 Java 中,字符串是不可变的,即创建后不能被修改。为了提高性能和节省内存空间,Java 使用了字符串常量池来管理字符串对象。
最近一直在关注“故障排查”的相关知识,首先着手的是OOM的异常。OOM异常通常会有Perm区的OOM(java7及以前)和HeapSpace的OOM,这两种各有不同的排查手段,但是在review上述两种案例的过程中,String.intern()是出现很多的一个方法,遂研究之。在网上找到了一篇写得不错的文章,就翻译下来给自己留点印象。原文地址:http://java-performance.info/string-intern-in-java-6-7-8/
领取专属 10元无门槛券
手把手带您无忧上云