JVM内存模型
-
本地方法栈,存放C++的native方法
-
程序计数器,指向程序当前运行的位置
-
栈(JVM栈),存放 函数、当前运行时的临时变量,存储的是对象的地址,最终指向堆存储的实际对象;如果一个对象在方法中new出来,并且只在这个方法中使用,这个对象会存放在栈中,当方法结束就会清理掉这个方法栈,减轻了GC的压力(JDK6-Java逃逸)
本地方法栈+程序计数器+栈(JVM栈),叫栈区,是线程私有的,有多少个线程就有多少个栈区
-
方法区(元空间),存放 static 的类、变量、方法,classloader 等全局数据信息
-
堆,存储对象,全局共享
JVM运行过程中的内存变化
-
当前线程执行方法,线程结束就删除当前栈
-
每个线程的栈区都有不同的方法栈,每个方法结束时,就会删除该方法栈
public static void main(String[] args){
int a=10;
fun1(a); //打印 11
System.out.println(a); //打印 10
}
static fun1(int a){
a++;
System.out.println(a);
}
如上代码,main方法中,fun1() 结束时,会清理掉fun1()的方法栈,此时再打印 a,会去读取main 方法中的 变量 a,值为 10
-
方法栈运行时可能产生对象,会在堆上开辟一块内存存储此对象,方法栈上会存储此对象的一个指针,当方法结束时,会清理掉这个指针,此时堆上的这个对象在当前栈区便没有引用指针了,但是又不知道是否有其他栈区(线程)有引用,清理问题,此时涉及到GC垃圾回收
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具