备战2022春招或暑期实习,祝大家每天进步亿点点!Java并发编程Day6
本篇总结的是 如何在Java中避免创建不必要的对象,后续会每日更新~
关于《我们一起学Redis》、《我们一起学HarmonyOS》等知识点可以查看我的往期博客
相信自己,越活越坚强,活着就该逢山开路,遇水架桥!生活,你给我压力,我还你奇迹!
目录
1、虚拟机栈与栈帧
Java的JVM划分为堆、栈、方法区等模块,这里的栈指的就是虚拟机栈;那什么是栈帧?虚拟机栈和栈帧又有什么关系呢?先来看一段代码:有了这些铺垫,后面的内容才会思路清晰,就可以很好的解释什么是栈帧?虚拟机栈和栈帧又有什么关系呢?
2、什么是栈帧
虚拟机为什么会划分一块虚拟机栈内存呢?其实虚拟机栈的内存空间是给线程使用的,每个线程启动后,虚拟机为其分配一块栈内存空间;每个线程分配的虚拟机栈内存区域由多个栈帧(Frame)组成,栈帧对应着每个方法调用时所占用的内存(线程运行时,其实就是执行我们编写的源代码编译后的字节码嘛、说到底就是一个个的方法调用);每个栈帧的由局部变量表、操作数栈、动态链接、方法返回值地址等组成。
虚拟机栈与栈帧的关系如下:StackOverflowError异常原因如下:
每个线程分配的栈内存空间就好比一根用来串珠子的绳子,绳子的长度是固定的,并且只能从穿入的那一端出入,珠子就好比线程运行过程中需要执行的方法,珠子有大有小,就好比方法因为其局部变量等原因,内存大小不一。每当调用一个方法,就需要穿入一颗珠子,方法执行完毕,珠子就会取出来。而上述例子发生StackOverflowError异常的原因,就是方法一直在循环调用没有返回,导致线程的分配的栈内存达到上限抛出了StackOverflowError异常。
图解方法调用时栈帧的变化,涉及到JVM层面的知识点,其中包括方法区、堆、虚拟机栈、栈帧、程序计数器,其大致作用如下所示:
方法区
方法区是虚拟机中一块线程共享的内存区域,用于存储类信息、常量池、静态变量、编译后的字节码等信息。在我们这个例子中,JVM层面执行的是字节码指令,而这些指令就是存储在方法区中。