JVM面试题:(二)内存结构和内存溢出、方法区的两种实现

内存结构:

方法区和对是所有线程共享的内存区域;而java栈、本地方法栈和程序员计数器是运行是线程私有

的内存区域。

Java堆(Heap),是Java虚拟机所管理的内存中最大的一块。Java堆是被所有线程共享的一块内

存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实

例都在这里分配内存。

方法区(Method Area),方法区(Method Area)与Java堆一样,是各个线程共享的内存区

域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数

据。

程序计数器(Program Counter Register),程序计数器(Program Counter Register)是一块

较小的内存空间,它的作用可以看做是当前线程所执行的字节码的行号指示器。

JVM栈(JVM Stacks),与程序计数器一样,Java虚拟机栈(Java Virtual Machine Stacks)也是

线程私有的,它的生命周期与线程相同。虚拟机栈描述的是Java方法执行的内存模型:每个方

法被执行的时候都会同时创建一个栈帧(Stack Frame)用于存储局部变量表、操作栈、动态链接、方法出口等信息。每一个方法被调用直至执行完成的过程,就对应着一个栈帧在虚拟机

栈中从入栈到出栈的过程。

本地方法栈(Native Method Stacks),本地方法栈(Native Method Stacks)与虚拟机栈所发

挥的作用是非常相似的,其区别不过是虚拟机栈为虚拟机执行Java方法(也就是字节码)服

务,而本地方法栈则是为虚拟机使用到的Native方法服务。

内存溢出发生的区域:

堆、栈、方法区都有可能发生内存溢出

方法区:

在jdk1.8之前是永久代,1.8之后是元空间

永久代的方法区,和堆使用的物理内存是连续的。

法区存在于元空间(Metaspace)。物理内存不再与堆连续,而是直接存在于本地

内存中,理论上机器「内存有多大,元空间就有多大」。

表面上看是为了避免OOM异常。因为通常使用PermSize和MaxPermSize设置永久代的大小就

决定了永久代的上限,但是不是总能知道应该设置为多大合适, 如果使用默认值很容易遇到

OOM错误。当使用元空间时,可以加载多少类的元数据就不再由MaxPermSize控制, 而由系统

的实际可用空间来控制啦。

相关推荐
我是廖志伟1 小时前
JVM新生代Eden区域深度解析
java·jvm·memory management
花城飞猪5 小时前
Android系统框架知识系列(二十):专题延伸:JVM vs ART/Dalvik - Android运行时演进深度解析
android·jvm·dalvik
Mr.朱鹏5 小时前
ShardingJDBC实战指南
java·jvm·数据库·spring·分库分表·shardingjdbc·shardingshere
星梦清河5 小时前
宋红康 JVM 笔记 Day16|垃圾回收相关概念
java·jvm·笔记
哈基米喜欢哈哈哈19 小时前
ThreadLocal 内存泄露风险解析
java·jvm·面试
星梦清河1 天前
宋红康 JVM 笔记 Day15|垃圾回收相关算法
jvm·笔记·算法
BillKu1 天前
Java核心概念详解:JVM、JRE、JDK、Java SE、Java EE (Jakarta EE)
java·jvm·jdk·java ee·jre·java se·jakarta ee
DKPT2 天前
Java内存区域与内存溢出
java·开发语言·jvm·笔记·学习
三毛20042 天前
玳瑁的嵌入式日记D33-0908(SQL数据库)
jvm·数据库·sql
Mr_Xuhhh2 天前
sqlite3的使用
jvm·oracle·sqlite