静态方法存放在jvm哪里_JVM系列(1)java8的内存结构

本文介绍了Java7和Java8的内存结构,包括PC寄存器、Java虚拟机栈、本地方法栈、Java堆和方法区。在Java8中,元空间取代了永久代,运行时常量池经历了变化。通过对内存结构的理解,帮助读者掌握Java内存管理的基本概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在一开始学习java的时候,那时候是在网上看视频,老师就经常提到什么对象分配在堆区,什么在栈区,那时候和理解,后来理解了就想着写一篇文章好好的去梳理一下。

想说一下这篇文章的脉络:
首先,研究 java7的内存结构,并对其进行一个详细的介绍,因为理解了java7之后java8比较容易理解
接下来,使用一个例子来详解我们在运行一个程序的时候,代码在java虚拟机中的存储和转化。
最后,我们给出 java8的内存结构,看一看做了哪些改动,并和java7进行一个比较。

第一部分:java7内存结构

先给一张java7的内存结构图吧(我用Windows里面的画图工具画的,所以看起来不怎么美观)

95d17398c18896aa38bc0efdeed933bd.png

首先对这个图有一个认识,从上面可以看到java7的内存结构大致分了五个部分:PC寄存器,java虚拟机栈、本地方法栈、java堆、方法区。其中PC寄存器、java虚拟机栈和本地方法栈是所有线程共享的一块内存区域。java堆和方法区是每一个线程隔离的一块区域,其中,方法区还有一个运行时常量池。

接下来看一看每一块区域里面存放的什么?

一、PC寄存器

在大学的时候学过计算机组成原理的时候都知道,内存里面有很多寄存器,大概几百个吧(目前的,之前大学学的时候老师说才几十个),每一种寄存器的用途都不一样,其中有一个寄存器就是程序计数器。这个寄存器的主要作用就是存放下一条需要执行的指令。

首先,为什么要有这个程序计数器呢?这是因为我们的处理器在一个时刻,只能执行一个线程中的指令。但是我们的程序往往都是多线程的,这时候处理器就需要来回切换我们的线程,为了在线程切换之后回到之前正确的位置上,此时就需要一个程序计数器,这也就很容易理解了我们的每个线程都有一个自己的程序计数器来保存自己之前的状态。

接下来如何理解这个程序计数器的功能呢?假如我们的程序代码假如是一行一行执行的,程序计数器永远指向下一行需要执行的字节码指令。在循环结构中,我们就可以改变程序计数器中的值,来指向下一条需要执行的指令。因此,在分支、循环、跳转、异常处理和线程恢复等等一些场景都需要这个程序计数器来完成。

最后看一下在什么情况下,应该存储什么内容。《java虚拟机规范》中说如果当前执行的是 Java 的方法,则该寄存器中保存当前执行指令的地址;倘若执行的是native 方法,则PC寄存器中为空(Undefined)。PC寄存区区域就是存放了N多个这样的寄存区。此内存区域是唯一一个在Java虚拟机规范中没有规定任何OutOfMemoryError情况的区域。因此可以把他的几个特点归纳如下。

  1. 程序计数器指定下一条需要执行的指令
  2. 每一个线程独有一个程序计数器
  3. 执行java代码时,寄存器保存当前指令地址
  4. 执行native方法时候,寄存器为空。
  5. 不会造成OutOfMemoryErr
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值