短视频
来源:短视频
被问烂了的面试题, JVM内存模型,还不会的话一定要听我一分钟介绍一下,面试的时候被问到你会来感谢我。
JVM内存模型说白了就是Java虚拟机在运行时使用的内存结构。它最主要的几部分有:堆、栈、方法区和程序计数器。
那堆呢. . 是JVM中最大的一块内存区域,用于存储对象实例。一般通过new创建出来的对象都存放在堆中。堆被所有线程共享,但是它的访问是线程不安全的,我们通常通过锁的机制来保证线程安全。 当堆中的对象超出内存无法回收会出现OOM异常,堆的大小可以通过启动参数进行调整,那具体调整方式呢 。。 需要根据你的系统类型、是否高并发和系统资源, 再结合压测进行调整, 详细调整方式大家有兴趣可以点赞,点赞数超过1000我会后续单独出一期调优最佳实践。
那栈呢主要用于存储方法调用和局部变量。每个线程在运行时都会有一个独立的栈,栈中的每个方法调用,都会创建一个栈帧。 栈帧包含了方法的参数、局部变量和返回值等信息。栈中的数据是线程私有的,不会被其他线程访问,所以是线程安全的。 当栈的深度被超出,会出现栈溢出StackOverflowError异常。
方法区。 在JDK 8及之后,也可以叫做元空间)它是所有线程共享的内存区域,存储了类的结构信息、常量池、静态变量和方法编译后的字节码等。方法区也可能发OOM内存出溢(比如大的静态数据、大量的反射和动态代理生成的类)可能消耗大量方法区空间。出方法区的大小也可以通过启动参数进行调整。
程序计数器是每个线程私有的,用于记录当前线程执行的字节码指令的地址。每个线程都有一个独立的程序计数器,用于控制线程的执行流程。
最后我想说的是:八股文确实烂大街了,但是面试依然会问,我花了几个月时间整理了一份80万字java面试八股文资料,从并发编程,JVM,Mysql,SSM,SpringBoot,Redis,MQ,网络,分布式,微服务,和各种中间件及项目场景解决方案,需要的小伙伴可以在评论区扣666进行领取。