JVM中的内存类型(数据区域)

Java一词狭义上指的是Java编程语言,广义上来说还包括Java平台。Java虚拟机作为一个平台来运行由Java源码编译成的.class文件,Java的跨平台性也是通过JVM来实现的。

JVM之所以称之为虚拟机,就是因为JVM就像是运行在底层物理机上面的一台虚拟机,它的各个部分互相配合,完成了一个Java应用程序的运行。本文就简单地对JVM运行过程中的各个数据区域做一个介绍。

JVM这个词语狭义上指的是一种规范,不特指某一种具体的实现,最常见的实现是Oracle的HotSpot,这里是一份所有JVM实现的列表。但是我们说JVM时也可以指HotSpot,本文是在参考Java SE 8的JVM说明和HotSpot的文档的基础上写的,哪些属于JVM说明,哪些属于HotSpot实现,我会在文中做出说明。

下图来自Oracle官网上一篇名为Java Garbage Collection Basics的文章。但是也有点问题,先贴上来,我会进行一些说明。
在这里插入图片描述Runtime Data Areas从左往右看,
第一个是Method Area,这是Java Virtual Machine Specification中的叫法,在HotSpot的Java SE 7版本中应该叫Permanent Generation,在HotSpot的Java SE 8版本中,取消了Permanent Generation,取而代之的是Metaspace,每个JVM进程中只有一个Method Area。Java应用程序运行时类加载器会寻找需要的类,找到后把.class文件加载到Method Area里面,.class文件包含jvm指令(也就是字节码)和一个常量池表(constant_pool table)以及其他辅助信息。我们写代码时定义了类,里面定义了这个类可以做的事情,.java文件被编译为.class文件后被加载到Method Area里面,Method Area里面的东西可以告诉JVM,它应该做什么以及怎么做。
每个JVM进程只有一块HeapHeap里面放着对象,在类被加载到Method Area里面后,会在Heap中创建相应的Class类型的对象,对于某一个类,不管在Heap中它有多少个对象,Heap中它对应的Class类型的对象始终都只有一个。Heap中的对象中只包含它的类中的域,类中的方法还是在Method Area中,有一个int域和一个方法的类的对象在Heap中占的内存大小和有一个int域十个方法的类的对象在Heap中占的内存大小一样。
Java Thread指的是Java应用程序运行时Java中的方法运行的栈,在JVM说明中叫Java Virtual Machine Stacks,每个线程有一个私有栈,栈中保存着Java方法的本地变量和中间结果,也承担着方法调用和方法返回的任务,通过栈帧(Frame)的压入和弹出实现。
每个Java线程有自己的Program Counter Register,在任意时刻,一个Java线程总是在执行某个方法的code,如果这个方法是Java中的(还有计算机平台中的本地方法),那么pc register中就是执行的方法对应的Java执行的地址,如果那个方法是本地方法,pc register中的值就是未定义的。
Native Internal Threads指的是本地方法栈,有些Java应用程序要用到本地的一些方法,例如在控制台的打印和输入,本地方法的运行单独在本地方法栈里面。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值