JVM【第七回】:【OutOfMemoryError异常之运行时常量池溢出】

如果要向运行时常量池中添加内容,最简单的做法就是使用String.intern()这个Native方法。该方法的作用是:如果池中已经包含一个等于此String对象的字符串,则返回代表池中这个字符串的String对象;否则将此String对象包含的字符串添加到常量池中,并且返回此String对象的引用。由于常量池分配在方法区内,我们可以通过-XX:PermSize和-XX:MaxPermSize限制方法区的大小,从而间接限制其中产量池的容量:代码如下:

package oom;

import java.util.ArrayList;
import java.util.List;

/**
 * 运行时常量池溢出
 * @author Madison
 * @date 2014-7-11
 * VM Args:-XX:PermSize=10M -XX:MaxPermSize=10M
 */
public class RuntimeConstantPoolOOM 
{
	public static void main(String[] args) 
	{
		//使用List保持着常量池引用,避免Full GC回收常量池行为
		List<String> list = new ArrayList<String>();
		int i = 0;
		while(true)
			list.add(String.valueOf(i++).intern());
	}
}

运行结果:

Exception in thread "main" java.lang.OutOfMemoryError: PermGen space

at java.lang.String.intern(Native Method)

at oom.RuntimeConstantPoolOOM.main(RuntimeConstantPoolOOM.java:20)

从运行结果中可以看到,运行时常量池溢出,在OutOfMemoryError后面跟随提示信息是“PermGen space”,说明运行时常量池属于方法区(HotSpot虚拟机中的永久代)的一部分。

欲知后事如何,且听下回分解

JVM【第七回】:【OutOfMemoryError异常之运行时常量池溢出】,布布扣,bubuko.com

时间: 2024-10-05 12:21:00

JVM【第七回】:【OutOfMemoryError异常之运行时常量池溢出】的相关文章

Java虚拟机OOM之运行时常量池溢出(5)

如果要向运行时常量池中添加内容,最简单的做法就是使用 String.intern()这个 Native 方法.该方法的作用是:如果池中已经包含一个等于此 String 对象的字符串,则返回代表池中这个字符串的String 对象:否则,将此 String 对象包含的字符串添加到常量池中,并且返回此 String 对象的引用.由于常量池分配在方法区内,我们可以通过-XX:PermSize 和-XX:MaxPermSize 限制方法区的大小,从而间接限制其中常量池的容量代码运行时常量池导致的内存溢出异

翻译:JVM虚拟机规范1.7中的运行时常量池部分(三)

4.4.7. The CONSTANT_Utf8_info Structure The CONSTANT_Utf8_info structure is used to represent constant string values: 代表常量字符串. The items of the CONSTANT_Utf8_info structure are as follows: 条目如下: tag The tag item of the CONSTANT_Utf8_info structure ha

JVM笔记3-java内存区域之运行时常量池

1.运行时常量池属于线程共享区中的方法区. 2.运行时常量池用于编译期生成的各种自变量,符号引用,这部分内用将在类加载后接入方法区的运行时常量池中存放. 看如下代码所示,如图: public class Test { public static void main(String[] args) { String s1 = "abc"; String s2 = "abc"; String s3 = new String("abc"); System

JVM 常量池、运行时常量池、字符串常量池

常量池: 即class文件常量池,是class文件的一部分,用于保存编译时确定的数据. 保存的内容如下图: 1 D:\java\test\out\production\test>javap -verbose mainTest 2 Classfile /D:/java/test/out/production/test/mainTest.class 3 Last modified 2019年4月22日; size 507 bytes 4 MD5 checksum 08699c6d713bc8967a

Java千百问_07JVM架构(019)_运行时常量池是什么

点击进入_更多_Java千百问 1.运行时常量池是什么 运行时常量池(Runtime Constant Pool),它是方法区的一部分.Class文件中除了有类的版本.字段.方法.接口等描述等信息外,还有一项信息是常量池(Constant Pool Table),用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载后存放到常量池中. 了解java内存管理看这里:jvm是如何管理内存的 如图: 运行时常量是相对于常量来说的,它具备一个重要特征是:动态性.当然,值相同的动态常量与我们通常说

String放入运行时常量池的时机与String.intern()方法解惑

运行时常量池概述 Java运行时常量池中主要存放两大类常量:字面量和符号引用.字面量比较接近于Java语言层面的常量概念,如文本字符串.声明为final的常量值等. 而符号引用则属于编译原理方面的概念,包括了下面三类常量: - 类和接口的全限定名(包名+类名) - 字段的名称和描述符 - 方法的名称和描述符 运行时常量池位置 运行时常量池在JDK1.6及之前版本的JVM中是方法区的一部分,而在HotSpot虚拟机中方法区放在了"永久代(Permanent Generation)".所以

五、运行时常量池

运行时常量池属于方法区的一部分,一个有效的字节码文件中除了包含类的版本信息.字段.方法以及接口等描述信息之外,还包含了一项信息,那就是常量池表.那么运行时常量池就是字节码文件中常量池表的运行时表示形式.运行时常量池中包含了多种不同的常量,比如编译期就已经明确的数值字面量到运行期后才能够获得的方法或者字段引用.运行时常量池类似于传统编程语言中的符号表,但是它包含的数据却比符号表更加丰富一些. 当类装载器成功将一个类或者接口装载进JVM中,就会创建与之对应的运行时常量池.在此大家要注意,由于每一个运

Java 运行时常量池

运行时常量池是方法区的一部分.class中除了有类的版本,字段,方法,接口等描述信息外,还有一项信息是常量池,用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载后存放在方法区的运行时常量池中. Java虚拟机对class文件的每一部分(自然也包括常量池)的格式都有严重的规定,每一个字节用于存储哪种数据都必须符合规范上的要求,这样才会被虚拟机认可,装载和执行.但对于运行时常量池,Java虚拟机规范中没有做任何细节的要求.一般来说,除了保存class文件中描述的符号引用外,还会把翻译出来

JVM 运行时常量池(Runtime Constant Pool)

基本特性: 方法区的一部分,在方法去中分配,加载泪或者接口后就创建运行时常量区. class文件每一个类或接口的常量池表(constant_pool table)的运行时表现形式, 包括编译期的数值字面量和运行期的方法或者字段引用 ref:class文件结构