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

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

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

3K20

常量池和堆的区别_字符串常量池在堆中还是方法区

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

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

    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在内部维护的一个静态内部类,用于对象缓存。

    1.1K30

    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函数比较)的字符串常量,就返回常量池中的常量,也就是堆中对应实例的引用。否则将这个字符串加入常量池。

    53120

    运行时常量池与字符串常量池_字符串常量池在堆中还是方法区

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

    98620

    Java内存分配之堆、栈和常量池

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

    1.4K20

    Java中的字符串常量池

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

    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 配置选项指定的。 默认情况下,堆内存池大小为零字节。 该值指示内核不定义堆内存池对象。

    49420

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

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

    71030

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

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

    3.6K30

    【初阶数据结构】森林里的树影 “堆” 光:堆

    将根结点最大的堆叫做最大堆或大根堆,根结点最小的堆叫做最小堆或小根堆 堆的性质: 堆中某个结点的值总是不大于或不小于其父结点的值 堆总是一棵完全二叉树 堆的结构: typedef int HPDataType...HPDataType HeapTop(HP* php) { assert(php); return php->a[0]; } 返回堆顶元素的值,最大堆的堆顶元素是堆中的最大值,最小堆的堆顶元素是堆中的最小值...我们知道无论是向上调整,还是向下调整,都要基于一个具有完整性质的堆下来实现,分为向上建堆和向下建堆 向上建堆: 向上建堆的核心思想是逐个插入元素到堆中,每插入一个元素就对其进行向上调整操作,使其满足堆的性质...其实就是对堆插入的模拟实现 建好堆之后,就能对堆进行排序,排序分为升序和降序 升序:建大堆 降序:建小堆 为什么排序是这样建堆呢?...(向下建堆) 向下建堆: 向下建堆的过程可以看作是一种分治策略,将一个大问题分解为多个小问题。

    6100

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

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

    5.4K74

    Java堆

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

    86220

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

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

    76920

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

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

    1.7K20

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

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

    63240

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

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

    52820

    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()之前已经出现过,字符串常量池中已经有它的引用,不符合“首次出现”的原则,而“计算机软件”这个字符串则是首次出现的

    61560

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

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

    93220
    领券