JVM内存区域解析

在JVM标准结构规范中,可以看到如下所示的内存结构:
这里写图片描述
下面我们对jvm中这几个区域及其中存放的内容进行详细描述:
####1.程序计数器(PC Register)
程序计数器是每个线程私有的,学习过操作系统我们应该知道其中存放的下一条指令在内存中的地址,在JVM中有些不同的是,如果当前线程执行的非native方法(该方法在jsl中称为current method),那么其中存放的是当前正在执行的指令在内存中的地址;如果该方法native的,那么其中是没有值得。
####2.虚拟机栈(JVM Stack)
虚拟机栈同程序计数器一样,也是线程私有的,随着线程的创建而创建,随着线程的销毁而被销毁,栈帧为存放基本单位,对于一个栈帧,其中主要是有局部变量、计算中间值、操作栈以及方法出口等信息。
虚拟机栈在内存中分配的不需要是连续空间,其大小既可以是分配的固定大小,也可以根据需要动态分配,如果是固定大小的虚拟机栈,那么在随线程被创建时大小就已经确定,如果是动态分配大小,那么可以使用-Xss对其大小阈值进行设置,如果在创建时jvm请求的大小超出stack大小上限值,则会抛出StackOverflowError,如果在创建线程stack时可用内存小于需要创建的stack大小,则会抛出OutOfMemoryError。

在jvms第一版中,又将这个空间称为我们熟知的Java Stack

####3. 堆(Heap)
堆空间是jvm运行时内存数据区,在jvm中是在jvm启动时就被创建的,随着jvm销毁而被销毁,在内存中不需要是连续的空间,其大小既可以是固定的也可以是动态分配的,动态分配时可以使用-Xms/-Xmx设置堆空间的阈值。
主要存放的是所有的已经分配空间的类实例和数组,如果需要更多的内存超过堆空间的自动存储管理系统(automatic storage management system,又被称为我们熟知的GC)可分配的空间,则会抛出OutOfMemoryError。
####4.方法区(Method Area)
方法区是一个jvm中所有线程共享的一块区域,随着jvm启动而创建,逻辑上属于堆空间上的一部分,但是在jsl中没有明确的规定它的存放位置和管理编译后代码的的策略,而且他的内存空间不需要是连续的,并且大小既可以是固定的也可以是按需动态分配的。在jdk6和jdk7中,方法区可以理解为永久区(Perm),永久区可以使用参数-XX:PermSize和-XX:MaxPermSize制定。默认情况下-XX:MaxPermSize为64MB。
其中存放着每一个类的结构例如运行时常量池、字段和方法信息以及方法和构造器的编译后的代码,包括在类和接口实例化时包含的/等特殊方法体。可能会抛出OurOfMemoryError错误。
####5.运行时常量池(Run-Time Constant Pool)
是由jvm中方法区来进行分配的,当类或接口的运行时常量池被jvm在创建类或接口实例时同时创建。
Class文件中除了包含类的版本、字段、方法以及接口等描述信息外,还包括的信息是常量池,用于存放各种在编译时生成的各种字面量和符号引用,这些内容将在类加载后存放到方法区的运行时常量池中。
可能会抛出OutOfMemoryError错误。
####6.本地方法栈(Native Method Stacks)
可以使用常见的栈(称为C Stack)的jvm实现来用于支持native方法,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值