讲一讲对java内存模型的了解
首先jvm内存空间分为五部分 方法区、堆、虚拟机栈,本地方法栈,程序计数器。
程序计数器是一块较小的内存空间,用来记录当前线程正在执行的那一条字节码指令的地址。如果当前线程正在执行的是本地方法,那么此时的程序计数器就为空。功能有两个:字节码解释器通过更改程序计数器的值来选取下一条要执行的字节码指令。从而实现循环、跳转、异常处理、线程恢复等基本功能。二每条线程都有一个独立的程序计数器,当多线程进行切换时候,记录线程的执行位置。程序计数器是java虚拟机中唯一一个没有规定OutOfMemoryError情况的区域。
方法区 是各线程共享的内存区域,它用于存放类信息,常量,静态变量,运行时常量池。
Java虚拟机栈是描述java方法运行过程的内存模型,每个方法在执行的同时都会创建一个栈帧的区域,用于存储局部变量表,操作数栈、动态链接表、方法出口等信息。每一个方法的调用直至完成的过程,就对应着一个栈帧在虚拟机中入栈到出栈的过程。StackOverflowError表示请求栈深度大于虚拟机所允许的最大深度,可能内存还有很多。无法申请足够内存OutOfMemoryError。
本地方法栈 结构与java虚拟机栈一样,只不过虚拟机栈执行java方法服务,运行java方法区域,本地方法栈运行本地方法内存模型,虚拟机使用到native方法服务。
堆用来存放类的对象实例,如果堆中没有内存完成实例分配,并且堆也无法再扩展,将会抛出OutOfMemoryError。
相关问题
普通方法与static方法运行上的区别
Static方法在方法区加载,普通方法在jvm栈加载。