首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Java字符串常量池_字符串常量池溢出

Java内存分配中,总共3种常量池: Java 常量池详解(二)class文件常量池 和 Java 常量池详解(三)class运行时常量池 1.字符串常量池(String Constant Pool...) 在JDK1.7之前运行时常量池逻辑包含字符串常量池存放在方法区, 此时hotspot虚拟机对方法区实现为永久代 在JDK1.7 字符串常量池被从方法区拿到了堆中, 这里没有提到运行时常量池,也就是说字符串常量池被单独拿到堆..., 只不过方法区实现从永久代变成了元空间(Metaspace) 1.1:字符串常量池在Java内存区域哪个位置?...(堆内是可以进行回收,然后方法区也是能回收,但是本身区域内存比较少,如果用字符串常量太多了,也会抛java.lang.OutOfMemoryError:PermGenspace 异常) 1.2:字符串常量池是什么...如果常量池中没有此字符串, 会将此字符串放入常量池中后, 再返回 native实现代码: \openjdk7\jdk\src\share\native\java\lang\String.c Java_java_lang_String_intern

95630
您找到你想要的搜索结果了吗?
是的
没有找到

jvm字符串常量池_java 常量

大家好,又见面了,我是你们朋友全栈君。 字符串 字符串字面量:就是指这个字符串本身,比如”Java”,”Hello”。...这两项就是java和abcd这两个字符串字面量。 而符号引用也是一些常量,比如全限定类名,字段名称和描述符,方法名称和描述符。 这是类名。 这是变量名。...c=”java”; String d=”abcd”; String e=”java”; String f=new String(“java”); } } 运行时常量池 && 字符串常量池 class常量池被加载到内存后...运行时常量池相对于class常量一个特点是具有动态性,Java不要求所有常量在编译器产生,可以在运行时产生常量加入常量池,例如String类intern()。...意思是当一个字符串对象调用intern方法,如果池中已经存在值相等(通过Stringequal函数比较)字符串常量,就返回常量池中常量,也就是堆中对应实例引用。否则将这个字符串加入常量池。

51020

Java字符串常量

JVM通过字符串常量池查找不到内容为droid字符串对象存在,那么会创建这个字符串对象,然后将刚创建对象引用放入到字符串常量池中,并且将引用返回给变量str1。...字符串常量池实现前提条件就是Java中String对象是不可变,这样可以安全保证多个变量共享同一个对象。...如果JavaString对象可变的话,一个引用操作改变了对象值,那么其他变量也会受到影响,显然这样是不合理。 引用 or 对象 字符串常量池中存放时引用还是对象,这个问题是最常见。...字符串常量池存放是对象引用,不是对象。在Java中,对象都创建在堆内存中。 更新验证,收到很多评论也在讨论这个问题,我简单进行了验证。...我们通过设置永久代一个很小值来进行验证。如果字符串对象存在字符串常量池中,那么必然抛出java.lang.OutOfMemoryError permgen space错误。

1.2K20

Java常量池【Class常量池、运行时常量池、字符串常量池】

在解析阶段,会把符号引用替换为直接引用,解析过程会去查询字符串常量池,也就是StringTable,以保证运行时常量池所引用字符串字符串常量池中是一致。...字符串常量字符串常量池在Java内存区域哪个位置? 在JDK6.0及之前版本,字符串常量池是放在Perm Gen区(也就是方法区)中; 在JDK7.0版本,字符串常量被移到了堆中。...在之前版本中,里放都是字符串常量 在中,由于发生了改变,因此中也可以存放放置在堆内字符串对象引用。...⚠️字符串常量池中字符串只存在一份,且被所有线程共享 ⚠️全局字符串池里内容是在类加载完成,经过验证、准备阶段之后在堆中生成字符串对象实例,然后将该字符串对象实例引用值存到中;中存是引用值而不是具体实例对象...在JDK1.7字符串常量池和静态变量被从方法区拿到了堆中,运行时常量池剩下还在方法区,也就是HotSpot永久代中。

1.5K20

Javaintern()函数和字符串常量

参考链接: Java字符串之-intern() // ==与equals区别:  // ==:  // 1、比较是操作符两端操作数是否是同一个对象  // 2、两边操作数必须是同一类型(可以是父子类之间...  *  * 它是java中唯一不需要new 就可以产生对象途径.  *  * 以 String s=”abce”;形式赋值在java中叫直接量,它是在常量池中而不是象new 一样放在压缩堆中....  * 这种形式字符串,在JVM内部发生字符串拘留,即当声明这样一个字符串后,JVM会在常量池中先查找有有没有一个值为”abcd”对象,如果有,就会把它赋给当前引用.即原来那个引用和现在这个引用指点向了同一对象...产生差异原因是:在JDK1.6中,intern()方法会把首次遇到字符串实例复制到永久代(常量池)中,返回也是永久代中这个字符串实例引用,而由StringBuilder创建字符串实例在Java...对str2比较返回false是因为”java”这个字符串在执行StringBuilder.toString()之前已经出现过,字符串常量池中已经有它引用,不符合“首次出现”原则,而“计算机软件”这个字符串则是首次出现

59260

字符串常量池_字符串常量池溢出

由于String字符串不可变性我们可以十分肯定常量池中一定不存在两个相同字符串(这点对理解上面至关重要)。 Java常量池,实际上分为两种形态:静态常量池和运行时常量池。...所以上面应该产生了两个对象:保存在栈中c和保存堆中chenssy。但是在Java中根本就不存在两个完全一模一样字符串对象。故堆中chenssy应该是引用字符串常量池中chenssy。...而字符串引用”+”运算是在Java运行期间执行,即str + str2 + str3在程序执行期间才会进行计算,它会在堆内存中重新创建一个拼接后字符串对象。...对于直接相加字符串,效率很高,因为在编译器便确定了它值,也就是说形如”I”+”love”+”java”; 字符串相加,在编译期间便被优化成了”Ilovejava”。...Stringintern()方法就是扩充常量一个方法;当一个String实例str调用intern()方法时,java查找常量池中是否有相同unicode字符串常量,如果有,则返回其引用,如果没有

58740

jvm常量池和字符串常量池_常量池中字符串是对象吗

大家好,又见面了,我是你们朋友全栈君 JVM——字符串常量池详解 引言 在Java开发中不管是前后端交互JSON串,还是数据库中数据存储,我们常常需要使用到String类型字符串。...字符串常量池由来 在日常开发过程中,字符串创建是比较频繁,而字符串分配和其他对象分配是类似的,需要耗费大量时间和空间,从而影响程序运行性能,所以作为最基础最常用引用数据类型,Java设计者在...实现原理 为了提高性能并减少内存开销,JVM在实例化字符串常量时进行了一系列优化操作: 在JVM层面为字符串提供字符串常量池,可以理解为是一个缓存区; 创建字符串常量时,JVM会检查字符串常量池中是否存在这个字符串...方法区和Java堆一样(但是方法区是非堆),是各个线程共享内存区域,是用于存储已经被JVM加载类信息、常量、静态变量、即时编译器编译后代码等数据。   ...当然,对于JDK1.8时,HostSpot VM对JVM模型进行了改造,将元数据放到本地内存,将常量池和静态变量放到了Java堆里。

50320

java 常量池和运行时常量池_常量池中字符串是对象吗

简介: 这几天在看Java虚拟机方面的知识时,看到了有几种不同常量说法,然后我就去CSDN、博客园等上找资料,里面说内容真是百花齐放,各自争艳,因此,我好好整理了一下,将我自认为对理解写下来与大家共同探讨...: 在Java内存分配中,总共3种常量池: 1.字符串常量池(String Constant Pool): 1.1:字符串常量池在Java内存区域哪个位置?...关于String在内存中存储和String#intern()方法说明,可以参考我另外一篇博客: 需要说明是:字符串常量池中字符串只存在一份!...(这里具体字符串如何分配就不细说了,可以看我另一篇博客) 2.class常量池(Class Constant Pool): 2.1:class常量池简介: 我们写每一个Java类被编译后,就会形成一份...在解析阶段,会把符号引用替换为直接引用,解析过程会去查询字符串常量池,也就是我们上面所说StringTable,以保证运行时常量池所引用字符串字符串常量池中是一致

45030

java常量

大家好,又见面了,我是你们朋友全栈君。 JAVA变量与常量 常量 常量常量 常量声明定义 常量 常量在c语言编程网中定义是指在程序整个运行过程中值保持不变量。...在这里要注意常量常量值是不同概念,常量值是常量具体和直观表现形式,常量是形式化表现。...这里体现出常量值这一定义,我认为常量值就是值,具体某一数值 百度出来常量是定义为两种意思:一是不可变变量,也是最最最开始接触java知道,二如上。...这是测试\\r与\\n区别 测试如下:测试数据\r\n一大堆字符串事实测试\r大堆字符串事实测试\n\r一大堆字符串事实测试\r大堆字符串事实测试\n一大堆字符串事实测试"); } //结果如下...这是测试\r与\n区别 测试如下:测试数据 一大堆字符串事实测试 大堆字符串事实测试 一大堆字符串事实测试 大堆字符串事实测试 一大堆字符串事实测试 //如上所示是我在eclipse中运行

63330

字符型常量字符串常量区别?

形式上: 字符常量是单引号引起一个字符;字符串常量是双引号引起 0 个或若干个字符。 2....含义上: 字符常量相当于一个整型值( ASCII 值),可以参加表达式运算;字符串常量代表一个地址值(该字符串在内存中存放位置)。...因为Java在内存中总是使用Unicode表示字符,所以,一个英文字符和一个中文字符都用一个char类型表示,它们都占用两个字节。...占内存大小:字符常量只占 2 个字节;字符串常量占若干个字节 (注意:char 在 Java 中占两个字节)。 4....Java语言要确定每种基本类型所占存储空间大小。基本类型大小不会随硬件架构变化而变化。这种存储空间大小不变性是Java语言具有可移植性主要原因之一。 ?

2.8K20

深入Java源码剖析之字符串常量

字符串Java生产开发中使用频率是非常高,可见,字符串对于我们而言非常关键。...Java中是如何实现字符串 那其实在Java中,关于字符串实现,其实用也是char数组,这可以从源码中得到体现。...而Java虚拟机如果发现常量池中已经存在需要创建字符串中,它就不会重复创建,而是指向那个字符串即可。 ?...字符串驻留 当相同字符串常量被多次创建时,注意是使用双引号(" ")显式声明时,字符串常量对象会被保存在常量池中,且只会创建一个对象,这就是字符串驻留,这个名词产生就是为了提升性能。...该方法会去常量池中寻找当前调用该方法字符串常量,若找到,则直接返回该字符串对象,若没有,则将当前字符串放入常量池并返回,总之该方法一定会返回字符串

40220

【面试题精讲】Java字符型常量字符串常量区别?

★ 有的时候博客内容会有变动,首发博客是最新,其他博客地址可能会未同步,认准https://blog.zysicyj.top ” Java字符型常量字符串常量是两种不同数据类型。...字符串常量字符串常量是由多个字符组成,用双引号括起来。例如:"Hello", "World"等。在内存中,字符串常量以字符数组形式存在,并且每个字符都有一个对应 Unicode 编码值。...长度不同:字符型常量只能包含一个字符,而字符串常量可以包含任意数量字符。 内存表示不同:字符型常量在内存中占用 2 个字节,字符串常量在内存中以字符数组形式存在。...操作方法不同:字符型常量可以进行一些基本字符操作,如比较、转换大小写等;字符串常量则可以进行更复杂字符串操作,如连接、截取、替换等。...(result); // 输出:Hello World 总结: 字符型常量字符串常量Java 中是两种不同数据类型,分别用于表示单个字符和多个字符组成字符串

17960

Java字符串常量相关一个问题

字符串常量到底是怎么回事?本来这个问题快要清楚了,一出现字符串常量,一下子又复杂了。...h2实际上呢是一个字符串常量,它和h3是同一个对象好像也是对。...这是因为字符串常量,在class文件常量池中,当执行到ldc指令去访问这个常量时候,如果该常量是一个字符串类型,hotspot就会在后面默默地创建一个字符串,并且,调用intern方法!...Java在加载字符串常量时候会调用一遍intern,那么StringTable里就会留下这个hotspot默认创建字符串。 好了。回到原问题。...所以h2和h1会是相等,都是StringTable里这个默认字符串。 而s3因为是计算得来,不是字符串常量,所以手动调用s3.intern()时,StringTable里留下就是s3。

87880

java常量有哪些_Java常量有哪些?

大家好,又见面了,我是你们朋友全栈君。 JAVA常量就是在程序中固定不变值,是不能改变数据。例如数字1、字符“a”、浮点数3.2等。那么java常量有哪些呢?...在Java中,常量包括整型常量、浮点数常量、布尔常量、字符常量等。 下面我们就一起来看看java这些常量。...4.字符串常量 字符串常量用于表示一串连续字符,一个字符串常量要用一对英文半角格式双引号””引起来,具体示例如下: “HelloWorld”“123″”Wecome XXX””” 一个字符串可以包含一个字符或者多个字符...以上就是动力节点java学院小编针对“Java常量有哪些?”...内容进行回答,希望对大家有所帮助,如果对于学习Java学习计划,怎么学才有效率,或者学完如果找工作问题,请在线咨询,有专业老师随时为你服务。

4.3K30

字符串常量池 运行时常量池_常量池中字符串是对象吗

大家好,又见面了,我是你们朋友全栈君。 字符串常量池 StringTable 概述 常量池在java用于保存在编译期已确定,已编译class文件中一份数据。...它包括了关于类,方法,接口等中常量,也包括字符串常量,如String s = “java”这种申明方式;当然也可扩充,执行器执行器产生常量也会放入常量池,故认为常量池是JVM一块特殊内存空间。...被final修饰,无法被继承 String与字符串常量池 在Java语言中有8种基本数据类型和一种比较特殊类型String。...这个后面重点谈 Java 6及以前,字符串常量池存放在永久代 Java 7中 Oracle工程师对字符串逻辑做了很大改变,即将字符串常量位置调整到Java堆内 所有的字符串都保存在堆...字符串常量池概念原本使用得比较多,但是这个改动使得我们有足够理由让我们重新考虑在Java 7中使用String.intern()。 Java8元空间,字符串常量在堆中。

25620

Java常量池解析与字符串intern简介

原文出处: iceAeterna   在Java应用程序运行时,Java虚拟机会保存一份内部运行时常量池,它区别于class文件常量池,是class文件常量池映射到虚拟机中数据结构。...5.CONSTANT_String入口解析 Java虚拟机会将字符串处理为一个字符串对象加以维护,而虚拟机所维护就是一张 字符串池,它包含所有被”拘留”字符串对象引用。...对CONSTANT_String常量解析首先就要查看字符串池中该字符串对象引用是否存在, 如果存在则直接把常量池数据解析为该字符串对象引用,若不存在,那么就需要根据这个字符串序列创建一个字符串对象...String对象,因为原 String对象位于Java堆,而字符串对象是虚拟机所创建,由虚拟机所维护。...(6).其他类型(数据基本类型)入口解析 直接使用常量池所包含常量值即可 6.直接引用 常量池解析最终将符号引用替换成为直接引用。指向类型、类变量和类方法直接引用可能为在方法区指针。

51220

java常量定义

大家好,又见面了,我是你们朋友全栈君。 在Java语言中,主要是利用final关键字来定义常量。当常量被设定后,一般情况下就不允许再进行更改。...为此可以使用final关键字来定义一个常量数组。这就是Java语言中一个很大特色。...不同语言,在定义变量或者常量时候,都有自己一套编码规则。这主要是为了提高代码共享程度与提高代码易读性。在Java语言中,定义常量时候,也有自己一套规则。...如在给常量取名时候,一般都用大写字符。在Java语言中,大小写字符是敏感。之所以采用大写字符,主要是跟变量进行区分。虽然说给常量取名时采用小写字符,也不会有语法上错误。...总之,Java开发人员需要注意,被定义为final常量需要采用大写字母命名,并且中间最好使用下划线作为分隔符来进行连接多个单词。

88830

什么是字符串常量池_常量池中字符串是对象吗

Java文件被编译成 Class文件,Class文件中除了包含类版本、字段、方法、接口等描述信息外,还有一项就是常量池,常量池是当Class文件被Java虚拟机加载进来后存放在方法区 各种字面量 (Literal...运行时常量池是当Class文件被加载到内存后,Java虚拟机会 将Class文件常量池里内容转移到运行时常量池里(运行时常量池也是每个类都有一个)。...运行时常量池相对于Class文件常量另外一个重要特征是具备动态性,Java语言并不要求常量一定只有编译期才能产生,也就是并非预置入Class文件中常量内容才能进入方法区运行时常量池,运行期间也可能将新常量放入池中...堆里边字符串常量池存放字符串引用或者字符串(两者都有) 比如new String(“test”)就会先在常量池中检查是否存在,不存在则在常量池中创建,然后堆中创建其引用。...② jdk 1.7及以后:直接将堆中(不是字符串常量池中)该字符串地址复制到字符串常量池中,这样字符串常量池就有了该字符串地址引用,也可以说此时字符串常量池中字符串只是一个对 堆中字符串对象引用

45640
领券