Appearance
说下对JVM内存模型的理解
JVM内存模型主要指的是Java虚拟机在运行时管理内存的方式,以及它如何保证线程之间规范而安全地共享数据。JVM内存模型可分为几个关键区域,各自负责不同的功能:
JVM内存结构
- 程序计数器(Program Counter Register):
- 每个线程都有自己的程序计数器,是一个小内存空间。它记录了当前线程执行的字节码的地址,帮助CPU知道下一步要执行的指令是哪个。这也是唯一一个在JVM规范中不报内存溢出的区域。
- Java虚拟机栈(Java Virtual Machine Stack):
- 每个线程也有自己独立的虚拟机栈。栈中保存着由一个个栈帧(Stack Frame)组成的信息。每个栈帧对应一次方法调用,保存局部变量表、操作数栈、动态链接、方法出口等信息。当方法执行完后,栈帧会弹出。
- 本地方法栈(Native Method Stack):
- 与虚拟机栈类似,但用于处理本机方法。Java程序使用JNI(Java Native Interface)调用其他语言(如C/C++)编写的程序,此时本地方法栈会被使用。
- 堆(Heap):
- JVM用来存储对象实例和数组。它是所有线程共享的区域,也是垃圾回收的主要区域。Java堆由多个代(年轻代、老年代)构成,这是为了提高GC效率。所有Java对象的实例都在这里分配内存。
- 方法区(Method Area):
- 也是线程共享的,用于存储已被JVM加载的类信息、常量、静态变量,即时编译后的代码等。Java 8开始将方法区移出了堆内存,成为了一个独立的元空间(Metaspace),并存储在本地内存中。
更新: 2024-08-11 13:35:37
原文: https://www.yuque.com/tulingzhouyu/db22bv/na254w56n5uogg0b
短视频
被问烂了的面试题, JVM内存模型,还不会的话一定要听我一分钟介绍一下,面试的时候被问到你会来感谢我。
JVM内存模型说白了就是Java虚拟机在运行时使用的内存结构。它最主要的几部分有:堆、栈、方法区和程序计数器。
那堆呢. . 是JVM中最大的一块内存区域,用于存储对象实例。一般通过new创建出来的对象都存放在堆中。堆被所有线程共享,但是它的访问是线程不安全的,我们通常通过锁的机制来保证线程安全。 当堆中的对象超出内存无法回收会出现OOM异常,堆的大小可以通过启动参数进行调整,那具体调整方式呢 。。 需要根据你的系统类型、是否高并发和系统资源, 再结合压测进行调整, 详细调整方式大家有兴趣可以点赞,点赞数超过1000我会后续单独出一期调优最佳实践。
那栈呢主要用于存储方法调用和局部变量。每个线程在运行时都会有一个独立的栈,栈中的每个方法调用,都会创建一个栈帧。 栈帧包含了方法的参数、局部变量和返回值等信息。栈中的数据是线程私有的,不会被其他线程访问,所以是线程安全的。 当栈的深度被超出,会出现栈溢出StackOverflowError异常。
方法区。 在JDK 8及之后,也可以叫做元空间)它是所有线程共享的内存区域,存储了类的结构信息、常量池、静态变量和方法编译后的字节码等。方法区也可能发OOM内存出溢(比如大的静态数据、大量的反射和动态代理生成的类)可能消耗大量方法区空间。出方法区的大小也可以通过启动参数进行调整。
程序计数器是每个线程私有的,用于记录当前线程执行的字节码指令的地址。每个线程都有一个独立的程序计数器,用于控制线程的执行流程。
最后我想说的是:八股文确实烂大街了,但是面试依然会问,我花了几个月时间整理了一份80万字java面试八股文资料,从并发编程,JVM,Mysql,SSM,SpringBoot,Redis,MQ,网络,分布式,微服务,和各种中间件及项目场景解决方案,需要的小伙伴可以在评论区扣666进行领取。
更新: 2024-05-16 13:48:02
原文: https://www.yuque.com/tulingzhouyu/db22bv/voem3pgu98wh39q7