不少java程序员一提JVM运行时数据区域,就会说堆和栈,当然也有java程序员给出方法区、虚拟机栈、本地方法栈、堆、程序计数器这个答案,但是还有人给出永久代、虚拟机栈、本地方法栈、堆、程序计数器这个答案。那么究竟哪种答案是正确的呢?

首先我们介绍两个概念,这对于我们回答上面的问题来说是必不可少的。

1.虚拟机: 简单的说虚拟机是一种抽象的计算机。

2.Java虚拟机规范: 虚拟机规范是一种对Java虚拟机的约束,Java虚拟机负责对虚拟机规范进行实现。

我们平常所说JAVA虚拟机一般是指的一种具体的JAVA虚拟机规范的实现,比如说HotSpot。当然市面上还有其他的Java虚拟机。

下面的截图内容来自https://docs.oracle.com/javas...

从JVM6规范,我们可以看到,规范要求的运行时数据区域有: PC Register(程序计数器)、Java Virtual Machine Stacks(java 虚拟机栈)、Heap(堆)、Method Area(方法区)、Native Method Stacks(本地方法栈)、Runtime Constant Pool(运行时常量池这及部分)。

注意标红部分,我们可以看到运行时常量池位于方法区内。

根据规范我们可以大概的画出JVM运行实数据区域(执行引擎、本地库接口在后面的文章中会进行详细介绍)。

在认真的看完JVM6、7、8的运行时数据区域规范之后,JVM6、7、8关于对运行时的数据区域要求一点变化都没有,还是程序计数器、Java虚拟栈、堆、方法区、本地方法栈、运行时常量池这几个部分。

那永久代是方法区的别名咯,准确的说是方法区的实现。规范是这么要求的,但是虚拟机会对这些区域进行调整,或者说是调整对JVM规范的实现。

查找了很多资料以后,还是没有找到官方对于永久代的描述(有找到官方文档关于永久代(Permanent Generation)的描述的,请联系我)。综合了很多博客和一些资料之后,我们可以做出如下判断,永久代是HotSpot虚拟机特有的概念,HotSpot团队使用永久代来实现JVM规范中的方法区。对于其他虚拟机来说是不存在永久代这个概念的。jdk8移除了永久代,关于这点我们将在后文进行详细的介绍。

那么为什么称方法区为永久代呢?

这跟GC分代收集有一定的关系,内存回收发生在方法区和堆中。

我们使用-XX:+PrintGCDetails参数,在IDEA中查看堆中的信息。

注意到PSYoungGen和ParOldGen这两个单词,从控制台的信息我们可以看出堆中的区域划分

PSYoungGen

eden space

from space

to space

ParOldGen

PS和Par代表垃圾回收器

也就是说堆里面又可以再分为年轻代、老年代,堆是垃圾回收机制的重点区域,将方法区也纳入垃圾回收范围,与年轻代、老年代相对,称方法区为永久代。

这就是永久代的来历。

接下来介绍一下JVM1.7和1.6的不同。

在介绍JVM1.6和1.7的区别之前,我们先介绍String类的intern()方法

字符串在调用该方法的时候,如果字符串常量池里面还没有该字符串,则将该字符串添加进字符串常量池中。

查了一下,还是没有查到HotSpot官方对于运行时数据区域的说明,但是许多博客都指出jdk1.7将字符串常量池移动到了堆中。

以下是分别在1.6、1.8的测试例子

1.6结果: false

1.7以上的结果:true

我们来解释一下原因,1.6中字符串常量池放在永久代中和堆是隔离的。

我们来画个图来解释一下,

1.6

1.7的虚拟机做了调整,常量池中不需要在存储一份对象了,可以存储堆中的引用,更为灵活。

1.7及以上的图

请看下一张图。

jdk版本在1.8。MetaSpace是什么鬼?

Jdk1.8移除了永久代或者说用MetaSpace去实现虚拟机规范中的方法区。

详见:JEP 122: Remove the Permanent Generation

我查了很多资料,还是没有找到官方对MetaSpace的解释和描述,到是在深入探究 JVM | 探秘 Metaspace这篇博客中看到了MetaSpace的相关描述。

In JDK 8, classes metadata is now stored in the native heap and this space is called Metaspace.

字符串常量池仍然在堆中,方法区移动至MetaSpace中

那么如果有人问你JVM运行时区域由几部分组成,那么应该如何回答呢?

我认为答案可以是这样的:JVM规范中的要求JVM运行时区域有以下及部分:

方法区

java虚拟机栈

本地方法栈

程序计数器

运行时常量池(位于方法区中)

但是不同的虚拟机对规范有着不同的实现,HotSpot1.6对方法区的实现叫永久代,1.7将字符串常量池移动到了堆中,1.8移除了永久代改用元数据区实现方法区,字符串常量池仍然在堆中。

Java进程中的堆和栈_对于JVM,你就只知道堆和栈吗?相关推荐

  1. 找出Java进程中大量消耗CPU

    问题分析: 1,程序属于CPU密集型,和开发沟通过,排除此类情况. 2,程序代码有问题,出现死循环,可能性极大. Java程序很耗CPU是比较好分析的,有这么几步: 1.通过top命令(top之后再按 ...

  2. 统计Java进程中的线程状态(jstack+linux)

    统计Java进程中的线程状态 第一步:查看Java进程ID 第二步:使用jstack命令dump线程信息,看看pid=45890进程中的线程都是什么状态 /usr/local/java/jdk1.8. ...

  3. 分析占用了大量 CPU 处理时间的是Java 进程中哪个线程

    为什么80%的码农都做不了架构师?>>>    下面是详细步骤: 1. 首先确定进程的 ID ,可以使用 jps -v 或者 top 命令直接查看 2. 查看该进程中哪个线程占用大量 ...

  4. linux java 进程内存_linux – 在java进程中消耗内存的是什么?

    我们正在尝试在中等负载下研究 java进程的内存使用情况. PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 12663 test 20 0 ...

  5. window 查找 java 进程中占用cpu比较高的线程

    概述 公司内部的一个产品 (java 开发的) 运行在 window 虚拟机上,运行一段时间后CPU飙升,然后想查看是哪个线程占用. 折腾了一下午,终于定位到该线程. 下面我们通过两种方式定位到占用c ...

  6. java抽象类中的变量修饰符_菜鸟整理的三个权限修饰符与接口、抽象类的总结...

    static 静态变量 被static修饰的变量其实是一个全局变量. 当这个类被虚拟机第一次加载的时候,就会为该变量分配了内存空间. 当该类创建实例时,并不会生成对static变量的拷贝.而是多个该类 ...

  7. java程序中默认包含的是_在 Java 程序设计中,由 Java 编译器默认导入的包是( )_学小易找答案...

    [单选题]22.抑郁发作的核心症状是 ( ) [单选题]有关微卫星的描述正确的是 [单选题]下列哪一种病毒的遗传物质为RNA [判断题]演示播放时用画笔添加的标注会在保存时留下来,将会更改原来的PPT ...

  8. java windows 取所有任务_Win下,通过Jstack截取Java进程中的堆栈信息

    在Java软件的使用过程中,有时会莫名的出现奇怪的问题.而这些问题常常无法使用日志信息定位,这时我们就需要通过查看进程内部线程的堆栈调用关系来分析问题出在哪里. 举个例子,当我们在做某个操作时,莫名的 ...

  9. java ee中ssh学后感_学习SSH,SSM框架有感

    JSP/Servlet基础 许多同学学习框架的时候,往往会忽视这部分内容,有的甚至没学JSP直接学习了框架,导致基础知识不扎实,只是会用框架,最后连JSP一共有几个内置对象都不知道.自己当时学的时候也 ...

  10. java语言中的合法的变量名_合法的变量名

    展开全部 变量可以通过变量名访问.在指令式语言中,变量通常是可变的:但在纯函数式语言(如Haskell)中,变量可能是e68a8462616964757a686964616f3133343365666 ...

最新文章

  1. 代码要想写得好,品位必须提一提!
  2. pandas groupby 分组操作
  3. CRMEB 小程序版源码下载
  4. 架构师最怕程序员知道的十件事
  5. java常见性能优化_十大最常见的Java性能问题
  6. tinydate.js[v0.3] 新增了字符串格式化为日期对象的函数
  7. xss challenge 解题思路(8-18)
  8. mysql 视图锁_Oracle数据库的锁类型及相关视图
  9. 服务器机房项目总结,机房建设项目总结报告.doc
  10. mysql 经纬度 距离 排序_MySQL根据经纬度按距离排序
  11. vbox虚拟机 做服务器,vbox虚拟机设置服务器(vbox虚拟机做服务器)
  12. 小米集团回应造车;移动公布1月份运营数据;中天科技拟回购公司股份;工信部发布春节流量数据...
  13. java dozer,MapStruct相当于提示(Dozer)?
  14. python-pdf的去水印操作
  15. excel表格多个文件夹计算机,excle多文件并排_如何在电脑桌面并排显示多个excel...
  16. String类型转json格式
  17. JAVA 时间戳与Date类型的相互转换、格式化日期、字符串日期转Date
  18. 大学行政职务、各类学生以及教师职称的英文翻译
  19. PaperTigerOS(第四天)
  20. Android中App控制字体大小

热门文章

  1. 1040 有几个PAT
  2. 单应性变换、仿射变换、透视变换
  3. [置顶] 原创鼠标拖动实现DIV排序
  4. Python3.X出现AttributeError: module 'urllib' has no attribute 'urlopen'错误
  5. [转载]sed实现直接修改文件内容
  6. tornado autoreload 模式
  7. JS调用ATL DLL
  8. OpenCV中ROI
  9. 可视化图布局算法简介
  10. 基于极限学习机的自编码器(ELM-AE)