首页
学习
活动
专区
圈层
工具
发布

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

1.5K30

jvm字符串常量池_java 常量池

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

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

    《Java-SE-第二十六章》之线程池

    线程池概述 什么是线程池?   线程虽然是轻量级进程,尽管线程比进程创建和销毁所消耗 的资源要少。...但是如果线程的创建和销毁频率高了,开销也还是有的,为了进一步提高效率,引入了线程池,池子里面放着事先创建好的线程.后面用的时候直接从池子里面拿,如此速度就快了,但是代价线程池所需的空间,线程池就是以空间换时间...如果从线程池直接拿的话,就省去了切换到内核态的时间,同时当线程不用的时候直接放回到线程池即可。...Java标准库中的线程池   标准库中线程池为ThreadPoolExecutor类,该类中最主要是包含两类线程,一类是核心线程,另一类是非核心线程。...; } } 运行结果: 简单实现线程池 线程池的基本逻辑   线程池事先存放着准备好的线程,当有任务提交入池的时候,实际上是放入了阻塞队列中,然后线程池中的线程调度执行这些任务,在java中的线程池有核心线程和非核心线程

    29330

    Java SE————base

    类型  56.7D 字节类型byte类型   范围 -128--127 字符类型char  'a' 每个字符代表一个编码 ,每个编码是用数字表示的              'a'  -->  98 字符串类型...Stringstr="字符串类型";              String str1="字符串类型";              str == str1 布尔类型boolean:false(默认值)...= str1){             System.out.println("两个字符串对象不相等");         }    if (str !...由自己面向整个装修过程开始转向面向装修公司      在java是把世界世生活中的实际东西,转换成我们的计算机语言。  ...学生 :学习 吃饭 睡觉 打游戏   java中用类来描述现实生活中的东西   Student{     int age;     String  name;     String sex

    59040

    【Java SE】继承

    学习完了类之后,我们将继续学习一个Java中的重点内容“继承” 继承 1.1 为什么需要继承 举例: 在Cat类中和Dog类中我们发现有很多一样的地方,这样写太浪费空间和内存了 我们可以把它相同的地方都用一个类来表示...从继承概念中可以看出继承最大的作用就是:实现代码复用,还有就是来实现多态(后序讲)  1.3 继承的语法  在Java中如果要表示类之间的继承关系,需要借助extends关键字,具体如下: 修饰符 class...都是Java中的关键字 2. 只能在类的非静态方法中使用,用来访问非静态成员方法和字段 3....组合表示对象之间是has-a的关系,比如:学校 组合和继承都可以实现代码复用,应该使用继承还是组合,需要根据应用场景来选择,一般建议:能用组合尽量用组合  总结:   后期博主会陆续更新Java...SE的知识 如有不足之处欢迎补充交流 看到这里的友友们,支持一下博主,来个免费三连,感谢!

    50210

    Java SE 网络

    如果服务器只为单个域提供宿主环境,则可以忽略键/值对用Java连接到服务器import java.io.IOException;import java.net.Socket;import java.util.Scanner...一个字符串构建一个URL对象:URL url = new URL(urlString); 如果只是想获得资源的内容,可以使用URL类中的openStream方法。...URI是个纯粹的语法结构,包含用来指定web资源的字符串的各种组成部分。URL是URI的一个特例,它包含了定位Web资源的足够信息。...setRequestProperty总览全局的方法:设置对特定协议起作用的任何“名-值(name-value)对”例如访问一个有密码保护的Web页:将用户名、冒号和密码以字符串形式连接一起String...input = username + ":" + password;计算上一步骤所得字符串的Base64编码Base64.Encoder encoder = Base64.getEncoder();String

    1.4K00

    【Java SE】数组

    ,介于[0, N)之间不包含N,N为元素个数,不能越界,否则会报出下标越界异常 1.3.2遍历数组 方法一:for循环 方法二:for each(增强for循环) 方法三:把数组转变为字符串...,然后返回 注意:使用Arrays.时导入包import java.util.Arrays; 知识拓展: 2.数组是引用类型 2.1初识JVM的内存分布 内存是一段连续的存储空间,主要用来存储程序运行时数据的...3.2例题2 1.数组对象是在堆上的 2.引用变量目前是在main函数里面的,它属于局部变量,当函数结束就会被回收 4.数组的应用 4.1自主实现Arrays.toString(将数组以字符串的方式打印...)功能 和C语言中的断言相比,Java中使用断言的情况较少。...Arrays在使用前要说明一下 import java.util.Arrays; Arrays.copyOf的使用很方便,不仅可以拷贝数组,还可以控制被拷贝数组的大小: 还可以实现部分拷贝:

    61130

    Java中的字符串常量池

    这一切都是源于JVM为了减少字符串对象的重复创建,其维护了一个特殊的内存,这段内存被成为字符串常量池或者字符串字面量池。...JVM通过字符串常量池查找不到内容为droid的字符串对象存在,那么会创建这个字符串对象,然后将刚创建的对象的引用放入到字符串常量池中,并且将引用返回给变量str1。...intern 对于上面使用new创建的字符串对象,如果想将这个对象的引用加入到字符串常量池,可以使用intern方法。...字符串常量池实现的前提条件就是Java中String对象是不可变的,这样可以安全保证多个变量共享同一个对象。...字符串常量池存放的是对象引用,不是对象。在Java中,对象都创建在堆内存中。 更新验证,收到的很多评论也在讨论这个问题,我简单的进行了验证。

    1.5K20

    Java SE(8)——继承

    1.继承的概念&作用 在Java中,继承是面向对象编程的三大基本特性之一(还有封装和多态),允许一个类(子类/继承类)继承另一个类(父类/基类)的属性和方法 继承的核心目的是: 1.子类能够在不改变父类原有特性的基础上进行扩展...以及它们之间的调用关系等到讲多态的时候再介绍 4.super关键字 4.1 使用super访问父类的成员 在Java中,super关键字用于在子类中引用其父类的成员。...如果想要访问父类的同名变量就需要借助super关键字 如果想要访问父类和子类中方法名一样,参数列表也一样的成员方法时,也可以借助super关键字 4.2 super&this的共性和区别① 共性: 1.都属于Java...2.从访问范围来看,this可以访问当前对象中的多有成员,但是super只能访问当前对象中从父类继承的成员 5.构造方法&初始化顺序 5.1 父类和子类的构造关系和执行顺序 当创建一个子类对象时,Java...无法在外部包的非子类中通过子类的引用来访问 注意二:在子类中,只能通过子类自己的引用来访问父类的protected成员;无法在子类中通过其他子类的引用来访问父类的protected成员 6.final关键字 在Java

    13610

    java se与java 的区别_java se与java的区别是什么

    Java是一门程序设计语言,它有三个版本,Java SE(标准版)、Java EE(企业版)和Java ME(微型版)。而Java SE只是一个使用Java进行编程的规范、框架,它不是一门编程语言。...Java SE(java standard edition),一般包括jdk、jre以及各种API文档等。 Java SE(Java Platform,Standard Edition)。...Java SE以前称为J2SE。它允许开发和部署在桌面、服务器、嵌入式环境和实时环境中使用的Java应用程序。...Java SE包含了支持Java Web服务开发的类,并为Java Platform,Enterprise Edition(Java EE)提供基础。...Java SE = jdk + jre ·jdk是开发Java程序用的; ·jre是运行java程序用的; Java SE就是Java应用程序,是一种分类,不是什么软件。

    2.2K20

    《JAVA SE》认识异常

    注意事项: 1. catch 只能处理对应种类的异常 java中一切皆是类,异常也是类,因此catch只能捕获相应的异常“类型”。...at demo02.Test.main(Test.java:12) after try catch 由于 Exception 类是所有异常类的父类....二、Java异常体系 Java中的异常分为两大类:一类叫做受查异常,另一类叫做非受查异常。...下图为Java内置的异常类之间的继承关系: 顶层类 Throwable 派生出两个重要的子类, Error 和 Exception 其中 Error 指的是 Java 运行时内部错误和资源耗尽错误....三、自定义异常类 Java 中虽然已经内置了丰富的异常类, 但是我们实际场景中可能还有一些情况需要我们对异常类进行扩展, 创建符合我们实际情况的异常.

    56210

    《JAVA SE》包装类

    a) Object类可以接受所有的引用数据类型(数组、类、接口),为了让Object类可以接受Java中一切内容,引入包装类,把基本类型的数值封装到类的对象之中就产生了包装类。...以整型为例子 : 装箱: int→Integer 拆箱:Integer→int 2.自动拆装箱 Java编译器的优化,使用包装类就和使用基本类型一模一样。 自动拆装箱是一种java语法糖。...(借助编译器实现了基于编译器的新语法,增强了Java程序的可读性,便于开发人员使用和维护。)...Java中的语法糖只存在于编译期, 在编译器将 .java 源文件编译成 .class 字节码时, 会进行解语法糖操作, 还原最原始的基础语法结构,如下为编译后的字节码: 有了自动拆装箱,使用包装类就和使用基本类型完全一致...3.当使用整型包装类的自动拆装箱时,JVM会缓存相应的数值(类似字符串常量池,详见博主上期的博文:认识String类) Integer常量池,默认在-128到127之间的取值,都会缓存到常量池中。

    69020

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

    JVM为了提升性能和减少内存开销,避免字符串的重复创建,其维护了一块特殊的内存空间,这就是我们今天要讨论的核心,即字符串池(String Pool)。字符串池由String类私有的维护。...字符串池的优缺点:字符串池的优点就是避免了相同内容的字符串的创建,节省了内存,省去了创建相同字符串的时间,同时提升了性能;另一方面,字符串池的缺点就是牺牲了JVM在常量池中遍历对象所需要的时间,不过其时间成本相比而言比较低...intern方法使用:一个初始为空的字符串池,它由类String独自维护。...Java语言规范(Java Language Specification)中对字符串做出了如下说明:每一个字符串常量都是指向一个字符串类实例的引用。字符串对象有一个固定值。...这是因为,字符串字面量拼接操作是在Java编译器编译期间就执行了,也就是说编译器编译时,直接把"java"、"language"和"specification"这三个字面量进行"+"操作得到一个"javalanguagespecification

    87220
    领券