JVM基础
JVM组成部分
java运行
- 使用javac命令将.java文件编译成.class文件
- 使用java命令执行.class文件
- 执行时类装载子系统将类资源加载到内存模型中
- 字节码执行引擎运行内存数据
内存模型
堆
当new一个对象时便会将对象放入堆中。
分为年轻代和老年代,新生代又包含Eden区和Survivor(s0+s1)区。默认内存比例为Eden:s0:s1:老年代=8:1:1:20。
栈
当调用方法时,栈会为每个方法开辟方法独有的内存空间放入方法自身的局部变量,这块空间称为栈帧。主要存储局部变量、操作数栈、动态链接、方法出口
方法变量:方法局部变量,对象变量时会存对象在堆中的地址,方便调用
操作数栈:数据的加、减、乘、除等一些操作时,存放数据使用。操作时将数据压入压出
动态链接:存放方法的入口,调用方法时可以去方法区找
方法出口:记录调用方法时的位置,当调用方法执行完成后,主方法可以知道已经执行到哪里,并执行后续方法
方法执行完毕后会销毁所分配的内存空间,即出栈。由于java方法调用链关系,栈是先进后出
本地方法
存储本地方法,Thread类中private native void start0()方法即为本地方法。
方法区
储存常量、静态变量、类信息
当静态变量为类变量时,静态变量存储对应类在堆中的地址。
类信息是指类的.class数据信息
程序计数器
记录当前执行的代码行位置(也有些时记录即将执行的代码行位置,不同JVM有差异),执行时由字节码执行引擎更改。
当A线程执行时有更高级别的B线程执行,A线程将挂起,B线程执行完后可以通过程序计数器确认A线程应该执行的代码位置。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App