JVM的五大区域

JVM五大内存区域你知道吗?—精要

1. 程序计数器

程序计数器是一块很小的内存空间,线程私有,行号指示器。

为什么需要程序计数器?

  1. 一个程序中有多条指令,利用程序计数器可以准确定位到正确执行位置。

注意 若线程执行的是Java方法,则计数器记录的是字节码指令的地址,若果是本地方法,则计数器为空唯一不存在内存溢出的区域

2. Java栈(虚拟机栈)

特点: 线程私有
功能: 保存方法的局部变量,操作栈、动态链接、方法出口等信息。
使用时间:主要在方法调用时使用

栈帧: 是用来存储数据和部分过程结果的数据结构。
栈帧的位置:  内存 -> 运行时数据区 -> 某个线程对应的虚拟机栈 -> here[在这里]
栈帧大小确定时间: 编译期确定,不受运行期数据影响。

我们平时所说的栈一般指局部变量表部分:
局部变量表信息
注意: 栈中的局部变量表在编译过程中就已经确定,在运行期间不会改变
可能出现的异常

1.栈深度达到虚拟机允许的最大深度:抛出栈溢出错误(StackOverflowError)
2.动态扩展无法申请到内存空间:内存溢出异常(OutOfMemory)

3.本地方法栈

特点: 与虚拟机栈相似,不过是为本地方法(native)服务。

4.堆

特点:在JVM中是最大的一块内存区域,线程共享(因而存在多线程访问,需要同步机制)、存放对象实例(所有用new申请的实例)、GC管理的主要区域(新生代、老年代)、当前主流的虚拟机如HotPot都能按扩展实现(通过设置 -Xmx和-Xms),但没有内存可申请则报内存溢出错误(OutOfMemoryError,OOM错误)。

5. 方法区(又称非堆区)

功能: 用于存储被虚拟机加载的类的信息、常量、静态变量

jdk1.7开始逐步去永久代。从String.interns()方法可以看出来
String.interns()
native方法:作用是如果字符串常量池已经包含一个等于这个String对象的字符串,则返回代表池中的这个字符串的String对象,在jdk1.6及以前常量池分配在永久代中。可通过 -XX:PermSize和-XX:MaxPermSize限制方法区大小。

参考:https://www.jianshu.com/p/76959115d486

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值