方法区(落地实现jdk7永久代,jdk8元空间),元空间并不在虚拟机中,而是使用本地内存,它和堆在逻辑上是连续的,但在物理上是不连续的,所以也叫非堆。

1、此区域是线程共享的。储存已加载的类型信息、常量、静态变量、即时编译器编译后的代码等数据;

2、常量池:编译器生成的各种字面量和符号引用;

3、关于字符串常量池和运行时常量池的位置说明:

JDK版本 方法区实现 变化
jdk1.6 永久代 字符串常量池、运行时常量池、静态变量都是在永久代中
jdk1.7 永久代 字符串常量池和静态变量被移动到了堆当中,运行时常量池还是在永久代中
jdk1.8 元空间 字符串常量池和静态变量仍然在堆当中;运行时常量池、类型信息、常量、字段、方法被移动都了元空间中

4、元空间的好处:

① 减少报OOM的可能:元空间与永久代类似,本质区别是元空间并不占用虚拟机内存了,而是使用本地内存,由于本地内存一般是比较大的,所以方法区就没有那么容易报OOM(OutOfMemoryError)。
② 提高JVM性能:元空间的垃圾回收很少,一定程度上减少了GC扫描及压缩的时间。
③类及相关的元数据的生命周期与类加载器的一致;
④ 每个加载器有专门的存储空间。

元空间的对象被垃圾回收的概率相对堆空间的对象是要小很多的,所有将两者分开,就减少了很多去扫描元空间对象带来的开销。

5、字符串常量池为什么要移动到堆空间中?
个人的理解:对于字符串常量这种创建完成用几次就不被使用的对象,是很容易被回收的。而要进行频繁垃圾回收的地方是堆空间, 这样在JDK7就把字符串常量池移动到堆空间中就是很明智和有必要的选择了。这样就避免了放到不频繁进行垃圾回收的元空间中应该被垃圾回收的对象而不能及时进行垃圾回收的浪费空间的现象出现。

思考:那么静态变量为什么也要在JDK7和字符串常量池一起移动到堆空间中呢?静态变量是不是和类一样的生命周期吗?

尚硅谷深解Java虚拟机(JVM)内存结构各部分总结【三层划分】https://blog.csdn.net/qq_43012792/article/details/107358550

方法区元空间实现之jdk7和8字符串常量池、运行时常量池、静态变量到底在哪?相关推荐

  1. JVM - 结合代码示例彻底搞懂Java内存区域_对象在堆-栈-方法区(元空间)之间的关系

    文章目录 Pre 示例demo 总体关系 代码示例论证 反汇编 Pre JVM - 结合代码示例彻底搞懂Java内存区域_线程栈 | 本地方法栈 | 程序计数器 中我们探讨了线程栈中的内部结构 ,大家 ...

  2. 运行时常量区-方法区

    文章目录 1.栈.堆.方法区的交互关系 2.方法区的理解 3.方法区在HotSpot VM中的演变 4.设置方法区大小 5.OOM的排查 6.方法区的内部结构 6.1 类型信息 6.2 类变量 (no ...

  3. jvm中方法区和常量池详解_Java常量池(静态常量池与运行时常量池)

    1.什么是常量 用final修饰的成员变量表示常量,值一旦给定就无法改变! final修饰的变量有三种:静态变量.实例变量和局部变量,分别表示三种类型的常量. Java中的常量池,实际上分为两种形态: ...

  4. Hi,运维,你懂Java吗--No.5:JVM--方法区元空间

    作为运维,你不一定要会写Java代码,但是一定要懂Java在生产跑起来之后的各种机制. 本文为<Hi,运维,你懂Java吗>系列文章 第五篇,敬请关注后续系列文章 欢迎关注 龙叔运维(公众 ...

  5. 动态链接(指向运行时常量池的方法引用)

    动态链接(指向运行时常量池的方法引用)

  6. 常量池在堆还是方法区_详解Java 虚拟机(第③篇)——String 类和常量池

    一.String 对象的两种创建方式 String str1 = "abcd"; String str2 = new String("abcd"); Syste ...

  7. JVM运行时数据区分析

    #1.概述 整个JVM构成⾥⾯,由三部分组成:类加载器机制.运⾏时数据区.执⾏引擎. #2.JVM运行时数据区的规范 我们来聊聊这个规范怎么理解,目前运行数据区共分为了方法区.堆.虚拟机栈.本地方法栈 ...

  8. JVM运行时数据区和各个区域的作用

    一.JVM主要分为5个核心区域(6个子区域),分别是: 程序计数器 Java虚拟机栈 本地方法栈 Java堆 方法区 *运行时常量池(属于"方法区"的一部分) 二.各个区域作用和描 ...

  9. 类和对象运行时在内存里是怎么样的?各种变量、方法在运行时是怎么交互的?

    转载自   类和对象运行时在内存里是怎么样的?各种变量.方法在运行时是怎么交互的? 在回答这个问题之前先了解一下Java的一些基础知识. 我们知道Java程序运行在虚拟机环境里,那我们先看一下虚拟机的 ...

最新文章

  1. Java多线程常见面试题及答案汇总1000道(春招+秋招+社招)
  2. 中小型金融企业该如何进行灾备建设?
  3. Tomcat - ClassFormatException的解决方法
  4. linux wireshark_4个好用的Linux监控工具
  5. 关于android ksoap获取失败的问题
  6. 深入理解 JVM Class文件格式(十)
  7. thymeleaf如何迭代遍历,如何判断
  8. Android 识别图片二维码
  9. 好大夫王航:长尾开发者应尽快接入百度轻应用
  10. 【信息学奥赛一本通 提高组】第一章 贪心算法
  11. VulnHub系列之Lampiao渗透测试
  12. 养生之道——》早上刷牙干呕&&慢性烟炎
  13. 目标检测论文解读复现之六:基于YOLOv5的遥感图像舰船的检测方法
  14. android 字体颜色 渐变色,Android渐变色处理
  15. MySQL-数据库的索引类型有哪些
  16. 重新定义智能空调,TCL发布智能空调新战略及产品阵容
  17. 【BYM】Android 实现相机快门动画,android音视频何俊林
  18. rdo远程桌面管理快捷键在哪里?
  19. 数据库:园林试题软件内容(城市绿地养护服务规范)
  20. 五、c++学习(加餐1:汇编基础学习)

热门文章

  1. win10计算机从桌面消失了,Windows10家庭版程序窗口在桌面上消失了解决方法
  2. java timezone_Java TimeZone setID()方法与示例
  3. 51单片机怎么显示当前时间_51单片机玩转物联网基础篇06-LCD1602液晶显示器
  4. android一个工程的xml怎么引用另外一个工程的xml,如何在Android中使用XML引用库中另一个包的字符串?...
  5. java bitset_Java BitSet toString()方法与示例
  6. 单层神经网络线性回归_单层神经网络| 使用Python的线性代数
  7. jquery的扩展方法介绍
  8. 受限玻尔兹曼机(RBM)与python在Tensorflow的实现
  9. packer build 报错 无任何输出 一直报“skipping line: 1 skipping line: 2 skipping line: 3.....”
  10. linux 程序占内存,linux下,一个运行中的程序,究竟占用了多少内存