小唯的JVM探索之路02-JVM内存区域概述

JVM内存区域概述

在这里插入图片描述

内存划分

  • 线程私有区域:java方法栈,本地方法栈,程序计数器。
  • 线程共享区域:堆,方法区。(需要GC垃圾回收)

JVM中各部分功能

程序计数器

它只占一小部分内存区域,可以当做当前线程执行的字节码的位置指示器;循环,判断,异常处理等都是依靠程序计数器完成的。

它保存着当前线程执行的字节码位置,每个线程工作时都有独立的计数器,只为执行Java方法服务,执行Native方法时,程序计数器为空.

虚拟机栈(java方法栈)

每个方法被执行的时候,Java虚拟机都会同步创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态连接、方法出口等信息。每一个方法被调用直至执行完毕的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。

局部变量表
  • 基本数据类型(boolean、byte、char、short、int、float、long、double),保存在栈中。
  • 引用类型(类类型、数组类型和接口类型),则是在栈中保存一个该方法地址,在堆中保存值。
  • returnAddress类型(指向了一条字节码指令的地址)。

tips:returnAddress类型 数据只存在于字节码层面,与编程语言无关。

本地方法栈

执行Java方法是使用栈,执行Native方法时使用本地方法栈.

Java堆可以处于物理上不连续的内存空间中,但在逻辑上它应该被视为连续的,这点就像我们用磁盘空间去存储文件一样,并不要求每个文件都连续存放。

在Heap中分配一定的内存来保存对象实例,实际上也只是保存对象实例的属性值,属性的类型和对象本身的类型标记等,并不保存对象的方法(以帧栈的形式保存在Stack中),在Heap中分配一定的内存保存对象实例。

方法区

用于存储已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据。

运行时常量池(Runtime Constant Pool)

它是方法区的一部分。Class文件中除了有类的版本、字段、方法、接口等描述等信息外,还有一项信息是常量池(Constant Pool Table),用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载后存放到常量池中。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值