Java内存区域

Java虚拟机在执行程序时,会将其所管理的内存分为五个区域分别为

  • 程序计数器
  • 虚拟机栈
  • 本地方法栈
  • 方法区

程序计数器

1.程序计数器概念:是一块较小的内存,可以看作当前线程执行字节码的行号指示器。

2.为什么会有它?

在Java虚拟机中,线程是通过轮流切换,分配cpu资源的,每一个线程当此轮结束后,都需要一个计数器,来记住此时线程执行到何处,以备下次获取资源还可以继续从此处执行

3.这一区域的特点

  • 当线程执行的是Java方法时,计数器记录字节码的指令地址。当线程执行的是native方法时,计数器值为空(Undefinded)
  • 由于它是记录每个线程的执行进度,并且互相不可干扰,所以应每个线程都有一个计数器,即为“线程私有”,随线程生,随线程灭。
  • 由于每次都是更新地址,所有内存不会有太大变化,是唯一不存在OutofMemory的区域。

Java虚拟机栈

1.Java虚拟机栈:也叫虚拟机栈,描述了java方法执行的内存模型,每个方法在执行时,都会创建一个栈帧,压入虚拟机栈,并且在方法执行结束后,这个栈帧就会出栈。

2.栈中每个帧所存储信息

  • 局部变量表

    • 方法中声明的非静态变量和函数形参
    • 基本数据变量存储值,引用类型存储指向对象的引用
    • 大小在编译器时就可以确定,在程序执行时不会改变
  • 操作数栈

    • 方法中的计算过程,类似于数据结构实现过的表达式求值
  • 指向运行时常量池的引用,方法执行可能会引用类的常量

  • 方法返回地址 ,方法执行完毕,返回调用这个方法的地址

    1. 线程私有

4.可能会抛出两种错误

 -  请求栈深度大于虚拟机允许深度--》StackOverflowError
 - 大多数虚拟机可以动态扩展,扩展时申请不到足够内存就会抛出--》OutofMemory

本地方法栈

1.为native方法服务,线程私有

2.native方法是什么?

期待更新 。。。。。。。。

1.堆为线程共享的区域,用来存储对象本身和数组(数组的引用在Java虚拟机栈),为垃圾回收的主要区域,JVM只有一个堆

方法区

1.方法区存储每个被虚拟机加载的类的信息(类名、方法信息、字段信息)、静态变量、常量、编译后的代码

2.运行时常量池:类或接口常量池的运行状态,在类和接口被加载到JVM时,对应运行时常量池被创建。在运行期间也可以将新常量放入常量池,比如String的intern方法。

3.GC也可以管理方法区(永久代)

4.jdk1.7以后运行时常量池从永久代移除。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值