学习JAVA虚拟机的内存区域(一)

JVM的内存区域

Java虚拟机在运行Java程序的时候,JVM会把它管理的内存分区分为不同数据区域,不同区域负责的功能也不同,不说废话,直接上图:
在这里插入图片描述

1. 程序计数器
程序计数器是一块较小的内存空间,可以看成是.class(字节码文件)的行号指示器,我认为在Debug断点调试就是使用到程序计数器来控制循环、跳转等。
由于JVM的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现,可以想成,一条主线程有很多小分支,这些分支就是一个线程去做他要完成的事情。但是由于要实现线程内,每个线程的程序计数器互不影响,程序计数器是线程独立,是线程私有的并独立储存的

2.Java虚拟机栈
Java虚拟机栈也是线程独立的,他的生命周期跟线程相同,主要描述的是方法执行的内存模型,每个方法执行的同事会创建栈帧去储存局部变量、操作数栈、动态链接、方法出口等就是一个方法从调用到执行完毕的过程就是对应Java虚拟机栈入栈到出栈的过程。
局部变量表存放基本数据类型(boolen、float、char、double、int、short、long、byte)对象引用(reference类型、不同于对象本身、有可能是指向对象起始地址的引用指针)
若线程的栈深度大于JVM虚拟机的最大深度,会抛出StackOverflowError异常(堆栈溢出错误),如果虚拟机可以动态扩展,扩展时无法申请到足够的内存就会抛出OutOfMemoryError异常(内存不足)。

3.本地方法栈
本地方法栈跟虚拟机栈功能类似,区别在于虚拟机栈是专门执行Java方法的,而本地方法栈是执行Native方法,Native方法(本地方法)也会抛出StackOverflowErrorOutOfMemoryError异常。

4.Java堆
Java堆是JVM管理内存的最大一块,在虚拟机启动的时候就已经创建,主要作用是:“Java堆存放所有变量实例,几乎所有对象实例都在Java堆分配内存。”随着JIt编辑器后来也不是那么“”绝对".
Java堆是线程共享的
Java堆是垃圾收集器管理的主要区域,根据Java虚拟机规定,Java堆可以不再联系的内存,只要逻辑上连续即可。

5.方法区
方法区是与Java堆医用,是各个线程共享的内存区域,用于存储虚拟机加载类信息、常量、静态变量
Java虚拟机对方法区的闲置非常宽松,可以不需要连续的内存和可以选择固定大小或者可扩展外,还可以不实现垃圾回收,但是不回收容易导致内存泄露
根据Java虚拟机规范的规定,当方法区无法满足内存分配需求时,将抛出 OutOfMemoryError异常。

猜你喜欢

转载自blog.csdn.net/weixin_42380504/article/details/102738413