本文共 835 字,大约阅读时间需要 2 分钟。
JVM内存模型
1. 概述
-
程序计数器 : 如果线程执行的是个java方法,那么计数器记录虚拟机字节码指令的地址。如果为native【底层方法】,那么计数器为空。这块内存区域是虚拟机规范中唯一没有OutOfMemoryError的区域。
-
虚拟机栈: java方法的执行和结束对应着栈帧的入栈和出栈,
-
栈帧 : 用于存储局部变量表,操作栈,动态链接,方法出口等信息
-
局部变量表所需要的内存空间在编译期完成分配,当进入一个方法时,这个方法在栈中需要分配多大的局部变量空间是完全确定的,在方法运行期间不会改变局部变量表大小。
-
Java虚拟机栈可能出现两种类型的异常:
- 线程请求的栈深度大于虚拟机允许的栈深度,将抛出StackOverflowError。
- 虚拟机栈空间可以动态扩展,当动态扩展是无法申请到足够的空间时,抛出OutOfMemory异常。
-
-
本地方法栈 : 本地方法栈是与虚拟机栈发挥的作用十分相似, 区别是虚拟机栈执行的是Java方法(也就是字节码)服务,而本地方法栈则为虚拟机使用到的native方法服务,可能底层调用的c或者c++, 我们打开jdk安装目录可以看到也有很多用c编写的文件,可能就是native方法所调用的c代码。
-
堆 : 对于大多数应用来说,堆是java虚拟机管理内存最大的一块内存区域,因为堆存放的对象是线程共享的,所以多线程的时候也需要同步机制。因此需要重点了解下。
实例在堆中( 也就是new的对象 )
-
方法区: 保存在着被加载过的每一个类的信息;static变量信息也保存在方法区中;
可以看做是将类(Class)的元数据,保存在方法区里;方法区是线程共享的;当有多个线程都用到一个类的时候,而这个类还未被加载,则应该只有一个线程去加载类,让其他线程等待;
方法区的大小不必是固定的,jvm可以根据应用的需要动态调整。
2. 内存溢出和内存泄漏是什么
简述一下:
溢出: 所需要用的内存大于系统给的内存
泄漏: 某对象不用了但是没被回收
转载地址:https://blog.csdn.net/weixin_40597409/article/details/115243862 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!