java运行时常量池包括字符串常量池吗? 5C

最近看java虚拟机,书上说 字符串常量池在jdk1.7移除方法区了,但是运行时常量池还是方法区的一部分,那意思是不是字符串常量池 和 运行时常量池 就是两个东西 ?没有关系?那String的intern()方法是往添加到哪个池?

7个回答

java运行时常量池包括字符串常量池的

qq_40699535
pennIncsdn 回复星辰醉天河: 放屁
2 天之前 回复
u013737132
星辰醉天河 回复学习园: java7及之前运行时常量池在方法区,java8在元空间里
9 个月之前 回复
u010644448
学习园 那书上说字符串常量池移到了堆上,那运行时常量池在哪个内存区域
一年多之前 回复

常量池在java用于保存在编译期已确定的,已编译的class文件中的一份数据。它包括了关于类,方法,接口等中的常量,也包括字符串常量,如String s = "java"这种申明方式;当然也可扩充,执行器产生的常量也会放入常量池,故认为常量池是JVM的一块特殊的内存空间。

u010644448
学习园 刚看到你的回复,JDK6和JDK7下全都是false好吗?原因是字符串字面量直接计算才会将结果放在字符串常量区,比如这种“ab”+"cde",如果用变量s1+s2相加的话,内部使用new stringbuffred做计算的,在堆上创建对象的,你再测试一下吧
一年多之前 回复
qq_38625202
qq_ycp 回复u010644448: 所以我个人认为常量池中包含字符串常量池和运行时常量池,应该是在两个区域
一年多之前 回复
qq_38625202
qq_ycp 回复u010644448: 而s2+s1的结果字符串常量池中找不到,所以结果放在运行时常量池中
一年多之前 回复
qq_38625202
qq_ycp 回复u010644448: 因为编译后字符串常量池会产生中会产生字符串常量"ab","cde","abcde",当s1和s2做连接后会去常量池中寻找“abcde”,找到后正好与s匹配所以结果是true
一年多之前 回复
qq_38625202
qq_ycp 回复u010644448: 你错了,答案是true
一年多之前 回复
u010644448
学习园 回复qq_38625202: 淡然是false,我想问一下,这两个常量池位于内存哪个区?
一年多之前 回复
qq_38625202
qq_ycp 回复u010644448: 看这段代码:String s1="ab";String s2="cde";String s="abcde";System.out.print(s1+s2==s);你认为这个会输出true还是false?还有System.out.print(s2+s1);s2+s1的结果是不是运行时常量?又是不是字符串常量呢?
一年多之前 回复
u010644448
学习园 上点心看问题,别复制
一年多之前 回复
u010644448
学习园 看过,还有有我问题里的疑问
一年多之前 回复

字符串常量池在编译时固定了,在运行时从中读取的

u010644448
学习园 那你的意思就是 运行时常量池包括字符串常量池 ? 那位于哪个内存区域呢?
一年多之前 回复

我是这么理解的,java代码编译成class文件后,class文件中存在常量池,其中包含了字面量,字符串直接量,符号引用等。
当把class文件中的一些常量加载到方法区的运行时常量池时,从java7开始,字符串常量使用的是java虚拟机堆上的内存。java6使用的方法区上的内存。

漏写补充:从java7开始,字符串常量池使用的是java虚拟机堆上的内存。java6使用的方法区上的内存。也就是说,java7开始,逻辑上,在方法区中运行时常量池中使用了在堆上的字符串常量池中常量。调用string.intern()还是往字符串常量池中加对象或引用(java7开始能加引用了)(如果该字符串不存在的话)。

u013737132
星辰醉天河 赞同 ,jdk8开始PermGen(方法区)被元空间(MetaSpace)取代了,元空间存放的有常量池、类元数据、方法元数据,只不过常量池里的字符串常量池从java7就移到jvm堆内存上了
9 个月之前 回复

运行时常量池逻辑上是包含字符串常量池的。
去永久代的过程在JDK7中只进行了一小步。从网上查到的资料来看,确实只将字符串常量池移出永久代,这属于jvm实现上的差异。
到JDK8永久代完全被元空间取代了。
《深入理解Java虚拟机》2.2.6 运行时常量池一节明确说明了Java虚拟机规范对运行时常量池没有做任何细节的要求,不同的提供商按需求实现虚拟机的这一区域。且接下来一段中说明运行时常量池的动态性时,明确提到了String类的intern()方法可以在运行时将新的常量放入运行时常量池,具体来说就是字符串常量池了。

No_comment
Himma° 都说了。运行时常量池和字符串常量池已经分开了,你最后一句话说的前后矛盾
大约一年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
java常量池:字符串常量池,静态常量池,运行时常量池,
字符串常量池(String Poll) java6: 存在于永久代中。 字符串常量池保存的是字符串常量。 java7: 转移到了堆中。 字符串常量池存的是字符串常量和堆内的字符串对象的引用。 静态常量池(class文件常量池) 用于存放编译器生成的各种字面量(Literal)和符号引用(Symbolic References)。 字面量:文本字符串int long 等基本类型...
字符串常量池及byte数据常量池
Byte型数据缓冲池Demo1public class BufferPoolDemo { public static void main(String[] args) { Integer i1=127; Integer i2=127; System.out.println(i1==i2); System.out.println(
java运行时常量池简单介绍
java一共实现了6中基本类型的常量池:Byte , Short,Integer,Long,Boolean,Characher。(Double和Float没有实现) 和一种String的常量池,他们在内存的方法区里 String常量池: String常量池可以储存各种不同大小的String常量,String str1 = “abc”时,他会在常量池创建abc这个字符串常量对象,并指向它 但你再次S...
Java常量池理解:class文件常量池、运行时常量池和字符串常量池
从String的不同创建方式谈起 字符串常量池、运行时常量池和class文件常量池理解 符号引用和直接引用
Java中的常量池(字符串常量池、class常量池和运行时常量池)
这几天在看Java虚拟机方面的知识时,看到了有几种不同常量池的说法,然后我就去CSDN、博客园等上找资料,里面说的内容真是百花齐放,各自争艳,因此,我好好整理了一下,将我自认为对的理解写下来与大家共同探讨:在Java的内存分配中,总共3种常量池:1.字符串常量池(String Constant Pool):1.1:字符串常量池在Java内存区域的哪个位置?在JDK6.0及之前版本,字符串常量池是放...
Java运行时常量池与final修饰符的关系
概述Java运行时常量池是JVM运行时内存模型的重要部分.我对常量池的理解大都来自于周志明大大的《深入理解Java虚拟机》, 书中对常量池有较多的描述与解释, 在内存管理, 类文件结构等部分章节中都有说明. 正如我之前的博文–JVM内存管理对常量池描述的一样,常量池会存储字面量和符号引用,但我有个疑问: 常量池与final修饰符的关系是怎么样的?Codepublic class Test{
基于JDK1.8 分析运行时常量池、字符串常量池、各种常量池
  Java中的常量池分为三种类型: 类文件中常量池(The Constant Pool) 运行时常量池(The Run-Time Constant Pool) String常量池   类文件中常量池 ---- 存在于Class文件中 所处区域:堆 诞生时间:编译时 内容概要:符号引用和字面量 class常量池是在编译的时候每个class都有的,在编译阶段,存放的是常量的符号引用...
JVM字符串常量池同运行时常量池关系理解
看《深入理解java虚拟机》时了解到方法区中存在运行时常量池(Runtime Constant Pool),运行时常量池会在类加载时载入class文件中的常量池信息(constant_pool table)。 public class Test{ public static String a = "a"; public s...
JDK1.8关于运行时常量池, 字符串常量池的要点
网上关于jdk 1.8的各种实验, 结论鱼龙混杂 , 很多都相矛盾,网上有的实验也被后人测试出了不同的结果 很多都分辨不了真假, 这里记录一下网络上正确的结论, 欢迎指正! 首先自行区分运行时常量池与Class文件常量池(静态常量池)的概念, JVM内存模型 ,方法区与永久代的区别, 有些在我的其他博客有介绍, 连接在文尾 在JDK1.7之前运行时常量池逻辑包含字符串常量池存放在...
Java字符串常量池是什么?为什么要有这种常量池?
Java字符串常量池是什么?为什么要有这种常量池? 简单介绍 Java中的字符串常量池(String Pool)是存储在Java堆内存中的字符串池。我们知道String是java中比较特殊的类,我们可以使用new运算符创建String对象,也可以用双引号(”“)创建字串对象。 Java中的字符串常量池 下图,清楚地解释了如何在Java堆内存中维护字...
字符串常量池
请问,String s3 = "sss" + "111";执行这一句之后,字符串常量池中有几个字符串?
Java字符串常量池,运行时常量池,jdk1.7后intern方法的变化
在之前在看jvm虚拟机的书,结果看到常量池的时候,看得一脸懵逼,去网上查也是云里雾里.所以这里自己花几天摸清楚后,在这里做个笔记 因为字符串常量池现在网上争议颇多,官方文档也说得很含糊,以下几点并不是很明确: 比如jdk1.7后的字符串常量池所存储的是否都是引用?还是对象和引用都有? jdk1.7后intern方法将字符串放到常量池,到底是在堆中创建对象,然后放的堆中的对象的引用,还是在直接...
常量池
介绍常量池之前先了解一个命令:javap 下面说一下常用指令: javap -s 查看目标类的内部类型签名信息(描述符),包括:字段类型签名,方法的类型签名 javap -c 对目标class反编译,可以查看指令的执行过程。 javap -v 类的附加信息,可以用来查看常量池,也是我们今天需要用到的命令。 现在进入正题—常量池。 jvm常量池其实包括两中类型: 1.编译时常量池(静态...
char也是在常量池里面吗?
java中String是一个char[]类型的数组,那char也是在常量池里面吗?如果是的话.rnString a ="A";rnchar ch = 'A';rnrna==ch;不应该是true吗?rn如果不是那他们该怎么比较?
字符串常量池的理解
字符串常量池 JVM为了减少字符串对象的重复创建,其维护了一块特殊的内存,这段内存被称为字符串常量池(存储在方法区中)。   具体实现 当代码中出现字符串时,JVM首先会对其进行检查。 ①、如果字符串常量池中存在相同内容的字符串对象,则将这个对象的地址返回。 ②、如果字符串常量池中不存在相同内容的字符串对象,则创建一个新的字符串对象并放入常量池。   class T1 ...
Java 字符串常量池
Java 字符串常量池
JVM-String常量池与运行时常量池
Start with JVM 先分析一波常量池-Constant Pool
Java字符串常量池
Java中==运算符判断两个对象是否指向同一个堆空间地址,但是下面的程序返回的却是true public class A { public static void main(String[] args) { String a = "ab"; String b = "a" + "b"; //TODO:思考为什么相等,返回值是True呢??...
jvm 常量池及运行时常量池
常量池 当我们将 .java文件编译成为了class文件后 常量池就存储在静态class文件中主要包含以下内容 字面量: 常量,字符串,基本类型等 符号引用: 类和接口全限定名,字段,方法名称及描述符 运行时常量池 当jvm加载class完成后,会将类的信息如常量池,字段,方法等数据装载进内存方法区 此时class文件里此时常量池就转变为了运行时常量池 为撒要生成 "运行时常量池" 因为常量不只是...
java常量池和运行时常量池
常量池(constant pool)指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。它包括了关于类、方法、接口等中的常量,也包括字符串常量。 运行时常量池指的是在jvm方法区中的一个内存。
静态常量池与运行时常量池
  运行时常量池是方法区的一部分。CLass文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池,用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载后进入方法区的运行时常量池中存放。 运行时常量池相对于CLass文件常量池的另外一个重要特征是具备动态性,Java语言并不要求常量一定只有编译期才能产生,也就是并非预置入CLass文件中常量池的内容才能进入方法区运行...
Java运行时动态编译
/** * Alipay.com Inc. * Copyright (c) 2004-2014 All Rights Reserved. */ package cannon.framework.util; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStre...
JAVA运行时数据区
JAVA运行时数据区分为5个区域: 1)方法区:存放类的类型信息。类型信息包括静态变量和方法信息,方法信息中包含类的所有方法的字节码。 2)堆:存储的全部是对象,每个对象都包含一个与之对应的Class类的对象。 3)(虚拟机)栈:保存线程的运行状态。包括局部变量表,操作数栈和栈帧信息。         局部变量表存放方法参数和局部变量。         操作数栈是线程的工作区,用来存放运
java运行时出错?
代码如下:rnclass Printingrn public static void main(String args[])rn for(int i=1;i<=5;i++)rn for(int j=1;j<=5;j++)rn System.out.print("#");rn rn System.out.println();rn rn rnrn错误如下:rnG:\java_lesson\Ch1>javac printing.javarnrnG:\java_lesson\Ch1>java printingrnException in thread "main" java.lang.NoClassDefFoundError: printing (wrong name:rn Printing)rn at java.lang.ClassLoader.defineClass0(Native Method)rn at java.lang.ClassLoader.defineClass(Unknown Source)rn at java.security.SecureClassLoader.defineClass(Unknown Source)rn at java.net.URLClassLoader.defineClass(Unknown Source)rn at java.net.URLClassLoader.access$100(Unknown Source)rn at java.net.URLClassLoader$1.run(Unknown Source)rn at java.security.AccessController.doPrivileged(Native Method)rn at java.net.URLClassLoader.findClass(Unknown Source)rn at java.lang.ClassLoader.loadClass(Unknown Source)rn at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)rn at java.lang.ClassLoader.loadClass(Unknown Source)rn at java.lang.ClassLoader.loadClassInternal(Unknown Source)rnrnG:\java_lesson\Ch1>rn
java运行时环境
java运行时环境, 可以运行java程序,linux环境安装包
java运行时的错误提示
rnjdk安装在d:\jdk1.3目录下,运行d:\java test提示下列错误:Could not open 'D:\prgram File\JavaSoft\JRE\1.3;d:\jdk1.3\jre\lib\jvm.cfg'rn在d:\jdk1.3\bin下运行正常rn
Java运行时数据区
开题明天写。
java运行时tomcat报错。
2014-6-16 10:12:51 org.apache.coyote.http11.Http11BaseProtocol initrn严重: Error initializing endpointrnjava.net.SocketException: Unrecognized Windows Sockets error: 0: JVM_Bindrn at java.net.PlainSocketImpl.socketBind(Native Method)rn at java.net.PlainSocketImpl.bind(PlainSocketImpl.java:359)rn at java.net.ServerSocket.bind(ServerSocket.java:319)rn at java.net.ServerSocket.(ServerSocket.java:185)rn at java.net.ServerSocket.(ServerSocket.java:141)rn at org.apache.tomcat.util.net.DefaultServerSocketFactory.createSocket(DernfaultServerSocketFactory.java:50)rn at org.apache.tomcat.util.net.PoolTcpEndpoint.initEndpoint(PoolTcpEndpoirnnt.java:293)rn at org.apache.coyote.http11.Http11BaseProtocol.init(Http11BaseProtocol.jrnava:139)rn at org.apache.catalina.connector.Connector.initialize(Connector.java:100rn2)rn at org.apache.catalina.core.StandardService.initialize(StandardService.jrnava:578)rn at org.apache.catalina.core.StandardServer.initialize(StandardServer.javrna:782)rn at org.apache.catalina.startup.Catalina.load(Catalina.java:504)rn at org.apache.catalina.startup.Catalina.load(Catalina.java:524)rn at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)rn at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.rnjava:39)rn at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccesrnsorImpl.java:25)rn at java.lang.reflect.Method.invoke(Method.java:592)rn at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:267)rn at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:432)rn2014-6-16 10:12:51 org.apache.catalina.startup.Catalina loadrn严重: Catalina.startrnLifecycleException: Protocol handler initialization failed: java.net.SocketExcernption: Unrecognized Windows Sockets error: 0: JVM_Bindrn at org.apache.catalina.connector.Connector.initialize(Connector.java:100rn4)rn at org.apache.catalina.core.StandardService.initialize(StandardService.jrnava:578)rn at org.apache.catalina.core.StandardServer.initialize(StandardServer.javrna:782)rn at org.apache.catalina.startup.Catalina.load(Catalina.java:504)rn at org.apache.catalina.startup.Catalina.load(Catalina.java:524)rn at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)rn at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.rnjava:39)rn at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccesrnsorImpl.java:25)rn at java.lang.reflect.Method.invoke(Method.java:592)rn at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:267)rn at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:432)rn2014-6-16 10:12:51 org.apache.catalina.startup.Catalina loadrn信息: Initialization processed in 921 msrn2014-6-16 10:12:51 org.apache.catalina.core.StandardService startrn信息: Starting service Catalinarn2014-6-16 10:12:51 org.apache.catalina.core.StandardEngine startrn信息: Starting Servlet Engine: Apache Tomcat/5.5.30rn2014-6-16 10:12:51 org.apache.catalina.core.StandardHost startrn信息: XML validation disabledrnloadConfig servlet is init...rn2014-6-16 10:12:53 org.apache.coyote.http11.Http11BaseProtocol startrn严重: Error starting endpointrnjava.net.SocketException: Unrecognized Windows Sockets error: 0: JVM_Bindrn at java.net.PlainSocketImpl.socketBind(Native Method)rn at java.net.PlainSocketImpl.bind(PlainSocketImpl.java:359)rn at java.net.ServerSocket.bind(ServerSocket.java:319)rn at java.net.ServerSocket.(ServerSocket.java:185)rn at java.net.ServerSocket.(ServerSocket.java:141)rn at org.apache.tomcat.util.net.DefaultServerSocketFactory.createSocket(DernfaultServerSocketFactory.java:50)rn at org.apache.tomcat.util.net.PoolTcpEndpoint.initEndpoint(PoolTcpEndpoirnnt.java:293)rn at org.apache.tomcat.util.net.PoolTcpEndpoint.startEndpoint(PoolTcpEndpornint.java:313)rn at org.apache.coyote.http11.Http11BaseProtocol.start(Http11BaseProtocol.rnjava:151)rn at org.apache.coyote.http11.Http11Protocol.start(Http11Protocol.java:76)rnrn at org.apache.catalina.connector.Connector.start(Connector.java:1075)rn at org.apache.catalina.core.StandardService.start(StandardService.java:4rn57)rn at org.apache.catalina.core.StandardServer.start(StandardServer.java:700rn)rn at org.apache.catalina.startup.Catalina.start(Catalina.java:552)rn at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)rn at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.rnjava:39)rn at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccesrnsorImpl.java:25)rn at java.lang.reflect.Method.invoke(Method.java:592)rn at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:295)rn at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:433)rn2014-6-16 10:12:53 org.apache.catalina.startup.Catalina startrn严重: Catalina.start:rnLifecycleException: service.getName(): "Catalina"; Protocol handler start failrned: java.net.SocketException: Unrecognized Windows Sockets error: 0: JVM_Bindrn at org.apache.catalina.connector.Connector.start(Connector.java:1082)rn at org.apache.catalina.core.StandardService.start(StandardService.java:4rn57)rn at org.apache.catalina.core.StandardServer.start(StandardServer.java:700rn)rn at org.apache.catalina.startup.Catalina.start(Catalina.java:552)rn at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)rn at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.rnjava:39)rn at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccesrnsorImpl.java:25)rn at java.lang.reflect.Method.invoke(Method.java:592)rn at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:295)rn at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:433)rn2014-6-16 10:12:53 org.apache.catalina.startup.Catalina startrn信息: Server startup in 2121 msrncom.trs.was.config.WASException: 1001#加载系统配置信息时出错#WASTools.LoadSysConrnfig#1001#从连接池获取数据库连接时出错#ConnectionPool.getConnection#Cannot creatern PoolableConnectionFactory (Database may be already in use: "Locked by another prnrocess". Possible solutions: close all other connection(s); use the server mode;rn SQL statement:rnnull/146892d9b1191ce5e89e35f88c0abbdecf123f4c0eb [90020-142])rn at com.trs.was.util.PTools.loadSysConfig(PTools.java:140)rn at com.trs.was.admin.KeyValidate.runThread(KeyValidate.java:75)rn at com.trs.was.monitor.LoadConfigThread.run(LoadConfigThread.java:118)
相关热词 c#检测非法字符 c#双屏截图 c#中怎么关闭线程 c# 显示服务器上的图片 api嵌入窗口 c# c# 控制网页 c# encrypt c#微信网页版登录 c# login 居中 c# 考试软件