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

java常量在方法区还是_JAVA常量

=> Java Class statics => Java Heap //类statics => Java 结论:jdk1.7的时候,常量已经被安排在里面了。...所以,最终的测试结论: 结论:这个常量(特指字符串常量而不是所有的常量),应该还是在Java heap里面, 上面的测试只能证明:jdk1.8中 字符串常量是在里面。...JAVA的三种常量 此外,Java有三种常量,即字符串常量(又叫全局字符串)、class文件常量、运行时常量。 1....*字面量就是我们所说的常量概念,如文本字符串、被声明为final的常量值等。 按照这个分析的话, 运行时常量和静态常量存放在元空间中,而字符串常量依然存放在中。...最终结论: 字符串常量在内存,类的元数据在本地内存。

2.7K20

常量的区别_字符串常量中还是方法区

Java文件被编译成 Class文件,Class文件中除了包含类的版本、字段、方法、接口等描述信息外,还有一项就是常量,常量是当Class文件被Java虚拟机加载进来后存放在方法区 各种字面量 (Literal...看下面两张图: 在中的字符串常量: **里边的字符串常量存放的是字符串的引用或者字符串(两者都有)**下面例子会有具体的讲解 符号引用表会在下面讲 我们知道,在Java中有两种创建字符串对象的方式...,这样,str1就指向了中创建的这个”aaa”字符串对象;如果没有,则首先在字符串常量池中创建一个”aaa”字符串对象,然后再在中创建一个”aaa”字符串对象,然后将中这个”aaa”字符串对象的地址返回赋给...JDK7中,由于字符串常量空间中,所以在s1.intern()运行时,发现字符串 常量没有常量,则添加中“11”对象的引用到字符串常量,这个引用返回空间“11”地址(注意这里也没有使用该返回值...JDK7中,常量空间,s1.intern()去常量池中查找”11″,发现没有该常量,则在字符串常量池中开辟空间,指向空间地址,则返回字符串常量指向的空间地址,s1也是空间地址,所以二者相等

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

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

Java的内存分配中,总共3种常量Java 常量详解(二)class文件常量Java 常量详解(三)class运行时常量 1.字符串常量(String Constant Pool...) 在JDK1.7之前运行时常量逻辑包含字符串常量存放在方法区, 此时hotspot虚拟机对方法区的实现为永久代 在JDK1.7 字符串常量被从方法区拿到了中, 这里没有提到运行时常量,也就是说字符串常量被单独拿到...在JDK6.0及之前版本,字符串常量是放在Perm Gen区(也就是方法区)中; 在JDK7.0版本,字符串常量被移到了中了。至于为什么移到内,大概是由于方法区的内存空间太小了。...(内是可以进行回收的,然后方法区也是能回收的,但是本身区域内存比较少,如果用的字符串常量太多了,也会抛java.lang.OutOfMemoryError:PermGenspace 异常) 1.2:字符串常量是什么...包装类的对象化技术的应用,并非是虚拟机层面的东西,而是 Java 在类封装实现的,IntegerCache 是 Integer在内部维护的一个静态内部类,用于对象缓存。

85630

运行时常量字符串常量_字符串常量中还是方法区

是在类加载完成,经过验证,准备阶段之后 在 中生成字符串对象实例,然后 将该字符串对象实例的 引用值 存到 String Pool 中。...在 HotSpot VM 实现的 String Pool 功能的是一个 StringTable 类,它是一个哈希表,里面存的是 驻留字符( 也就是用双引号括起来的部分)的 引用(而不是驻留字符串实例本身...),也就是说在中的某些字符串实例被这个 StringTable 引用之后就等同被赋予了”驻留字符串”的身份。...2.1、参考文章: Java字符串(String Pool)深度解析 3、Runtime Constant Pool( 运行时常量java文件被编译成class文件之后,也就是会生成我上面所说的...,那么就直接查询StringTable,保证StringTable的引用值与运行时常量池中的引用值一致,大概整个过程就是这样了。

64820

jvm字符串常量_java 常量

字符串 字符串字面量:就是指这个字符串本身,比如”Java”,”Hello”。...c=”java”; String d=”abcd”; String e=”java”; String f=new String(“java”); } } 运行时常量 && 字符串常量 class常量被加载到内存后...运行时常量相对于class常量的一个特点是具有动态性,Java不要求所有常量在编译器产生,可以在运行时产生常量加入常量,例如String类的intern()。...,后来放到了中,其中保存的是字符串对象的引用,而真正的字符串对象实例是在中创建。...意思是当一个字符串对象调用intern方法,如果池中已经存在值相等(通过String的equal函数比较)的字符串常量,就返回常量池中的常量,也就是中对应实例的引用。否则将这个字符串加入常量

49320

Java内存分配之、栈和常量

java内存分配中的 内存用来存放由new创建的对象和数组。在中分配的内存,由java虚拟机的自动垃圾回收期来管理。...这也是java比较占内存的原因。 实际上,栈中的变量指向内存中的变量,这就是Java中的指针!...说到这里,对常量池中的字符串值的存储位置应该有一个比较明了的理解了。 在程序执行的时候,常量会储存在Method Area,而不是中。...String的 intern()方法就是扩充常量的 一个方法;当一个String实例str调用intern()方法时,Java 查找常量池中是否有相同Unicode的字符串常量,如果有,则返回其的引用...结论:   字符串是一个特殊包装类,其引用是存放在栈的,而对象内容必须根据创建方式不同定(常量).有的是编译期就已经创建好,存放在字符串常 量池中,而有的是运行时才被创建.使用new关键字,存放在

1.2K20

zephyr笔记 2.3.3 内存

1 前言 内存是一个预定义的内存对象,它允许线程以类似 malloc() 方式从公共内存区域动态分配内存。...2 概念 只能定义一个内存。与其他内存不同,内存不能使用其内存地址直接引用。 内存的大小是可配置的。支持以下大小:256字节,1024字节,4096字节和16384字节。...当线程完成一内存时,它可以通过调用 k_free() 将块释放回内存。...2.1 内部操作 内存定义了包含整个的单个最大大小块; 即,一个256,1024,4096或16384字节的单个块。 内存还定义了64字节的最小块大小。...3 操作 3.1 定义内存 内存的大小是使用 CONFIG_HEAP_MEM_POOL_SIZE 配置选项指定的。 默认情况下,内存大小为零字节。 该值指示内核不定义内存对象。

43620

Java中的字符串常量

这一切都是源于JVM为了减少字符串对象的重复创建,其维护了一个特殊的内存,这段内存被成为字符串常量或者字符串字面量。...intern 对于上面使用new创建的字符串对象,如果想将这个对象的引用加入到字符串常量,可以使用intern方法。...字符串常量实现的前提条件就是Java中String对象是不可变的,这样可以安全保证多个变量共享同一个对象。...字符串常量存放的是对象引用,不是对象。在Java中,对象都创建在内存中。 更新验证,收到的很多评论也在讨论这个问题,我简单的进行了验证。...e.printStackTrace(); } } } return null; } } 由于字符串常量存在于内存中的永久代

1.2K20

Java

本文涉及:JVM中的新生代老年代、的内存分配策略、深浅的概念等 Java 是被所有线程共享的一块内存区域,在虚拟机启动时创建。这个区域是用来存放对象实例的,几乎所有对象实例都会在这里分配内存。...新生代 新生代一般占据内存的1/3的空间,因为Java程序中的对象绝大部分是朝生夕死的特性,新生代中每次GC都会有大量对象被回收,新生代的GC操作也是最为频繁的。...浅指对象本身占用的内存,不包括其内部引用对象的大小。...深指只能通过该对象访问到的(直接或间接)所有对象的浅之和,即对象被回收后,可以释放的真实空间。...3.Java多线程面试必备基础知识汇总 4.Java集合源码分析汇总 5.Linux常用命令汇总

82920

java、栈、堆栈,常量的区别,史上最全总结

我们今天重点讲的是Java和栈也就是系统方面的和栈。 Java、栈和常量 (下面以图文的方式讲解,方便大家理解) 1....例如字符串常量,在编译阶段就把所有的字符串文字放到一个常量池中。 (1)节省内存空间:常量池中所有相同的字符串常量被合并,只占用一个空间。...(2) 然后在中(不是常量)创建一个指定的对象,并让str引用指向该对象。 (3) 在常量池中查找是否存在内容为"abc"字符串对象。...String的intern()方法就是扩充常量的一个方法;当一个String实例str调用intern()方法时,Java查找常量池中是否有相同Unicode的字符串常量,如果有,则返回其的引用,如果没有...(heap):一种通用性的内存(也存在于RAM中),用于存放所有的JAVA对象。不同于堆栈的好处是:编译器不需要知道要从分配多少存储区 域,也不必知道存储的数据在存活多长时间。

2.6K30

java、栈、堆栈,常量的区别,史上最全总结

我们今天重点讲的是Java和栈也就是系统方面的和栈。 Java、栈和常量 (下面以图文的方式讲解,方便大家理解) 1....例如字符串常量,在编译阶段就把所有的字符串文字放到一个常量池中。 (1)节省内存空间:常量池中所有相同的字符串常量被合并,只占用一个空间。...(2) 然后在中(不是常量)创建一个指定的对象,并让str引用指向该对象。 (3) 在常量池中查找是否存在内容为"abc"字符串对象。...String的intern()方法就是扩充常量的一个方法;当一个String实例str调用intern()方法时,Java查找常量池中是否有相同Unicode的字符串常量,如果有,则返回其的引用,如果没有...(heap):一种通用性的内存(也存在于RAM中),用于存放所有的JAVA对象。不同于堆栈的好处是:编译器不需要知道要从分配多少存储区 域,也不必知道存储的数据在存活多长时间。

4K63

Java字符串(String Pool)深度解析

JVM为了提升性能和减少内存开销,避免字符串的重复创建,其维护了一块特殊的内存空间,这就是我们今天要讨论的核心,即字符串(String Pool)。字符串由String类私有的维护。...字符串的优缺点:字符串的优点就是避免了相同内容的字符串的创建,节省了内存,省去了创建相同字符串的时间,同时提升了性能;另一方面,字符串的缺点就是牺牲了JVM在常量池中遍历对象所需要的时间,不过其时间成本相比而言比较低...Java语言规范(Java Language Specification)中对字符串做出了如下说明:每一个字符串常量都是指向一个字符串类实例的引用。字符串对象有一个固定值。...以上是Java语言规范中的原文,比较官方,用更通俗易懂的语言翻译过来主要说明了三点:1)每一个字符串常量都指向字符串池中或者内存中的一个字符串实例;2)字符串对象值是固定的,一旦创建就不能再修改;3)...而字符串引用的"+"运算是在Java运行期间执行的,即str + str2 + str3在程序执行期间才会进行计算,它会在内存中重新创建一个拼接后的字符串对象。

69220

Java中的常量【Class常量、运行时常量字符串常量

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

1.3K20

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

由于String字符串的不可变性我们可以十分肯定常量池中一定不存在两个相同的字符串(这点对理解上面至关重要)。 Java中的常量,实际上分为两种形态:静态常量和运行时常量。...所以上面应该产生了两个对象:保存在栈中的c和保存中chenssy。但是在Java中根本就不存在两个完全一模一样的字符串对象。故中的chenssy应该是引用字符串常量池中chenssy。...而字符串引用的”+”运算是在Java运行期间执行的,即str + str2 + str3在程序执行期间才会进行计算,它会在内存中重新创建一个拼接后的字符串对象。...String的intern()方法就是扩充常量的一个方法;当一个String实例str调用intern()方法时,java查找常量池中是否有相同unicode的字符串常量,如果有,则返回其引用,如果没有...* 字符串由String类维护,我们可以调用intern()方法来访问字符串

53940

Java的各种连接你真的懂了?

使用连接务必确保复用 的本质意义在于复用: 创建连接时,很可能一次性创建了多个连接,大多数连接考虑到性能,会在初始化的时候维护一定数量的最小连接(毕竟初始化连接的过程一般是一次性的),可以直接使用...如果每次使用连接都按需创建连接,那么很可能你只用到一个连接,但是创建了N个连接。 连接一般会有一些管理模块,即连接的结构示意图中的绿色部分。 大多数的连接都有闲置超时。...有些连接还需独立线程负责连接保活功能。因此,启动一个连接相当于启动了N个线程。...连接不释放,还可能会引起线程泄露: 连接不复用 使用这个连接来请求一个会返回OK字符串的服务端接口: 访问该接口几次后执行jstack,可以看到有很多叫作Connection evictor的线程...IPv6 0xe4522438da39cf31 0t0 TCP 127.0.0.1:64404->127.0.0.1:30666 (ESTABLISHED) java 91607

61430

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

原文出处: iceAeterna   在Java应用程序运行时,Java虚拟机会保存一份内部的运行时常量,它区别于class文件的常量,是class文件常量映射到虚拟机中的数据结构。...5.CONSTANT_String入口解析 Java虚拟机会将字符串处理为一个字符串对象加以维护,而虚拟机所维护的就是一张 字符串,它包含所有被”拘留”的字符串对象的引用。...对CONSTANT_String常量的解析首先就要查看字符串池中该字符串对象的引用是否存在, 如果存在则直接把常量数据解析为该字符串对象的引用,若不存在,那么就需要根据这个字符串序列创建一个字符串对象...,并将其引用加入到字符串池中,并将常 量数据解析为该引用。...String对象,因为原 String对象位于Java,而字符串的对象是虚拟机所创建的,由虚拟机所维护。

50320

Java的intern()函数和字符串常量

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

57560

JAVA字符串常量和缓冲理解与作用「建议收藏」

字符串也可以被称为字符串常量,我认为这个名称就是产生误解的根源,有些人说着说着就把字符串三个字省略了,只剩下了常量… 所以为了避免误解,我建议在指代字符串对象的缓存的时候,就直接称之为字符串...UTF8编码的字节序列,而不是Java字符串对象,它就和你在一个txt文本中存储的字符串一样,我们用UTF8格式来打开一个.class文件,可以看到hellohellohellohellohello是可以被解析的...2 字符串 字符串Java为了重用String对象而设置的一个缓存Java1.7之前设置在方法区上,保存的是String对象;Java1.7之后设置在堆上,保存的是String对象的引用,String...下文中以Java1.7之后的情况为标准。 继续上面的例子。...不过,和字符串不同的时,这些Wrapper不会像字符串一样可以增长,也就是池中的对象数目是固定的,Integer池中只会有-128~127。

77120

字符串常量

我直接否定了三妹的答案,“使用 new 关键字创建一个字符串对象时,Java 虚拟机会先在字符串常量池中查找有没有‘二哥’这个字符串对象,如果有,就不会在字符串常量池中创建‘二哥’这个对象了,直接在中创建一个...我回答,“由于字符串的使用频率实在是太高了,所以 Java 虚拟机为了提高性能和减少内存开销,在创建字符串对象的时候进行了一些优化,特意为字符串开辟了一个字符串常量。”...三妹突然插话到,“有了字符串常量,就可以通过双引号的方式直接创建字符串对象,不用再通过 new 的方式在中创建对象了,对吧?” “是滴。...“那哥,字符串常量在内存中的什么位置呢?”三妹问。 我说,“三妹,你这个问题问得好呀!” 在 Java 8 之前,字符串常量在永久代中。 ?...Java 8 之后,移除了永久代,字符串常量就移到了中。 ? “哥,能再简单给我解释一下方法区,永久代和元空间的概念吗?有点模糊。”三妹说。 我说,“可以呀。”

47340
领券