gpt4 book ai didi

JVM的内存分配及各种常量池的区别(静态常量池、运行时常量池、字符串常量池)

转载 作者:我是一只小鸟 更新时间:2023-04-14 14:31:10 36 4
gpt4 key购买 nike

JVM内存分配

先了解下JVM中的内存分配,此处以hotspot vm为例(官方jdk采用的vm) 。

程序计数器

1. 虚拟机栈

2. 本地方法栈

Java堆

堆内存是各个线程共享的区域 。

方法区

它用于存储已经被虚拟机加载的类信息、常量、静态变量、即编译器编译后的代码等数据。静态变量、常量在方法区,所有方法,包括静态和非静态的,也在方法区 。

这里解释一下方法区:

  • 首先方法区不是在堆中,在java8之前是用永久代实现的, 永久代 是 Hotspot 虚拟机特有的概念,虽然 Java 虚拟机规范把方法区描述为堆的一个 逻辑部分 ,但是它却有一个别名叫做 Non-Heap(非堆) ,目的应该是与 Java 堆区分开来 。

  • java8之后是用元空间实现的,元空间并不在虚拟机中,而是使用本地内存.

只是 JVM 规范 中定义的一个概念,用于存储被 JVM 加载的类信息、常量、静态变量、即时编译器编译后的代码等数据 。

  。

常量池

常量池分为 静态常量池 和 运行时常量池 。

1. 静态常量池

也叫 class文件常量池 ,主要存放编译期生成的各种 字面量(Literal)和符号引用(Symbolic References) .

final类型的常量在编译期间就会进行分配.

静态常量池指的是在编译期确定,保存在class文件中的一些数据.

静态常量池是在编译期间生成的,存储在.class文件中.

  。

字面量(Literal)和符号引用量,字面量相当于Java语言层面常量的概念,如文本字符串、声明为final的常量值等 ,符号引用则属于编译原理方面的概念,包括了如下三种类型的常量:

  • 1、类和接口的全限定名; 。

  • 2、字段的名称和描述符; 。

  • 3、方法的名称和描述符.

2. 运行时常量池

  • 当类加载到内存中后,JVM就会将class常量池中的内容存放到运行时常量池中;运行时常量池里面存储的主要是编译期间生成的字面量、符号引用等等.

  • 类加载在链接环节的解析过程,会符号引用转换成直接引用(静态链接)。此处得到的 直接引用 也是放到运行时常量池中的.

  • 运行期间可以动态放入新的常量 。

运行时常量池内存位置:java8之前都在方法区中,java8之后在元空间 。

2.1 字符串常量池

字符串常量池,也可以理解成运行时常量池分出来的一部分。类加载到内存的时候,字符串会存到字符串常量池里面。利用池的概念,避免大量频繁创建字符串 。

  • JDK6时字符串常量池位于运行时常量池,JDK7挪到堆中.

Hotspot8之前,使用持久代实现方法区,由于持久代内存不好估算,很容易到值OOM:Perm Gen异常。而元空间是本地内存,取决于操作系统分配内存.

字符串常量池位置变迁

Jdk1.6及之前: 有永久代, 运行时常量池在永久代,运行时常量池包含字符串常量池 。

Jdk1.7:有永久代,但已经逐步“去永久代”,字符串常量池从永久代里的运行时常量池分离到堆里 。

Jdk1.8及之后: 无永久代,运行时常量池在元空间,字符串常量池里依然在堆里 。

  。

  。

参考文章 。

(62条消息) 深入理解java虚拟机(全章节完整)_TJtulong的博客-CSDN博客 。

(62条消息) Java | JVM | 详细图解,坚持看完,带你真正搞懂Java虚拟机_唐 城的博客-CSDN博客 。

(62条消息) Java-双亲委派机制_七楼、的博客-CSDN博客 。

(62条消息) Java-类加载器 11127222 七楼、的博客-CSDN博客 。

(62条消息) jvm中的常量池到底在哪里? 常量池在哪里 yuan_qh的博客-CSDN博客 。

(62条消息) Java方法区和永久代 java永久代和方法区 yuan_qh的博客-CSDN博客 。

这一次,彻底弄懂java中的常量池 - 掘金 (juejin.cn) 。

(62条消息) JAVA常量池,一篇文章就足够入门了。(含图解) lei'chang'liang'chi 河海哥yyds的博客-CSDN博客 。

(62条消息) Java 常量池详解(一)字符串常量池_new hilbert()的博客-CSDN博客 。

彻底搞清楚class常量池、运行时常量池、字符串常量池 - Awecoder - 博客园 (cnblogs.com) 。

 

  。

最后此篇关于JVM的内存分配及各种常量池的区别(静态常量池、运行时常量池、字符串常量池)的文章就讲到这里了,如果你想了解更多关于JVM的内存分配及各种常量池的区别(静态常量池、运行时常量池、字符串常量池)的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com