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的内存分配及各种常量池的区别(静态常量池、运行时常量池、字符串常量池)的更多相关文章

  1. 认识JVM的内存分配

    当我们在JVM中运行一段程序代码,JVM初始运行的时候都会分配好Method Area(方法区)和Heap(堆),而JVM每遇到一个线程,就为其分配一个Program Counter Register ...

  2. JVM初探- 内存分配、GC原理与垃圾收集器

    JVM初探- 内存分配.GC原理与垃圾收集器 标签 : JVM JVM内存的分配与回收大致可分为如下4个步骤: 何时分配 -> 怎样分配 -> 何时回收 -> 怎样回收. 除了在概念 ...

  3. 一夜搞懂 | JVM GC&内存分配

    前言 本文已经收录到我的Github个人博客,欢迎大佬们光临寒舍: 我的GIthub博客 学习导图 一.为什么要学习GC&内存分配? 时代发展到现在,如今的内存动态分配与内存回收技术已经相当成 ...

  4. JVM总结(二):JVM的内存分配策略

    这节我们总结一下JVM中的内存分配策略.目录如下: 内存分配策略 对象优先在新生代Eden分配 大对象直接进入老年代 长期存活的对象将进入老年代 动态对象年龄判定 空间分配担保 内存分配策略 Java ...

  5. JVM的内存分配垃圾回收策略

    之前看过<深入了解Java虚拟机>感觉容易忘,今天写一篇博客加深一下印象. JVM的内存分配和垃圾回收(GC)主要发生在Java堆中.而Java堆根据对象的存活时间可以分为新生代和老年代, ...

  6. JVM中内存分配策略及堆和栈的比较

    最近愈发对JVM底层的运行 原理产生了兴趣,遂查阅相关资料以备忘. 内存分配策略 根据编译原理的观点,程序运行时的内存分配,有三种策略,分别为静态的.堆式的.栈式的. 静态存储分配指的是在编译时就能确 ...

  7. C—动态内存分配之malloc与realloc的区别

    在程序的执行期间分配内存时,内存区域中的这个空间称为堆(heap).还有另一个内存区域,称为堆栈(stack),其中的空间分配给函数的参数和本地变量.在执行完该函数后,存储参数和本地变量的内存空间就会 ...

  8. jvm的内存分配总结

    最近看了周志明版本的<深入理解Java虚拟机>第一版和第二版,写的很好,收获很多,此处总结一下.   jvm中内存划分:   如上图,一共分为五块,其中: 线程共享区域为: 1.java堆 ...

  9. jvm对象内存分配

    一.jvm简单结构图 1.jvm内存对象分配整体流程: 1.类加载子系统和方法区 类加载子系统负责从文件系统或者网络中加载Class信息,加载的类信息存放于一块称为方法区的内存空间.除了类的信息外, ...

  10. jvm的内存分配

    java内存分配 A:栈 存储局部变量 B:堆 存储所有new出来的 C:方法区(方法区的内存中) 类加载时 方法信息保存在一块称为方法区的内存中, 并不随你创建对象而随对象保存于堆中; D:本地方法 ...

随机推荐

  1. qtconsole和jupyter-notebook的对应启动命令行配置

    jupyter-notebook: set conda_path=D:\use\program\Miniconda3 pushd %conda_path% call Scripts\activate. ...

  2. SpringBoot系列---【maven项目引入第三方jar包并打包发布】

    一.问题 项目中经常会碰到这样的问题,我们做的项目依赖别人打好的jar包,这种我们可以有两种途径解决,第一种是上传到私服,再从我们的项目去引入pom坐标,这种适合有私服账号或者自己会搭建私服的,成本有 ...

  3. STL练习-ACboy needs your help again!

      ACboy was kidnapped!! he miss his mother very much and is very scare now.You can't image how dark ...

  4. vue3.0的生命周期函数

    stetup(){}在 生命周期函数 系列中的优先级 〇setup(){ //优先级最高 处于created生命周期之前的函数,是无法访问data,methods中的数据是无法访问到的,setup中的 ...

  5. El_获取域中存储的值和El_获取域中存储的值_对象值

    2获取值 1.el表达式只能从域对象中获取值 2语法: 1.$[域名称.键}:从指定域中获取指定键的值域名称:1.pageScope2.requestScope 3.sessionScope 4.ap ...

  6. git 更改子项目索引

    git update-index --cacheinfo 160000 97ed2f63b07c73bad9a4d55e96e25292 source/lvdao/crf-sdk git reset ...

  7. Keil MDK5编译时出现错误:error: L6002U: Could not open file …\obj\main.o: No such file or directory,

    原因:电脑系统用户名中存在中文字符 解决:用户环境变量,找到变量 TEMP 和 TMP,将变量值中的"%USERPROFILE%"使用"C:\user\default&q ...

  8. 虚拟机文件丢失,虚拟机无法启动,通过xx-flat.vmdk和xx-delta.vmdk恢复虚拟机

    突然掉电,导致虚拟机文件夹里面的文件丢失,只剩余-flat.vmdk和-delta.vmdk文件,其他文件全部丢失,文件格式原本为"文件"格式.新建虚拟机无法直接使用此文件夹里面的 ...

  9. 我是如何被我的c++大作业榨干的

    手把手教你用git上传项目到GitHub(图文并茂,这一篇就够了),相信你一定能成功!! - 知乎 (zhihu.com) C++ 类对象数组_Slience_Perseverance的博客-CSDN ...

  10. vue3.0知识整理与总结

    在性能方面,对比Vue2.x,性能提升了1.3~2倍左右:打包后的体积也更小了. 非兼容的功能 一些和Vue2.x版本改动较大的语法,在Vue3存在兼容问题 v-modal   组件通信  v-for ...