jvm基础
jvm 中两个线程:
1、守护线程:jvm自己使用的线程,比如垃圾回收(GC)就是一个守护线程
2、普通线程:一般的java程序线程,只要JVM中有普通线程在执行,那么JVM就不会停止
结束生命周期
在如下几种情况下,Java虚拟机将结束生命周期
1、执行了System.exit()方法
2、程序正常执行结束
3、程序在执行过程中遇到了异常或错误而终止进程
4、由于操作系统出现错误而导致Java虚拟机进程终止
JDK和JRE的区别
JDK是面向开发人员使用的SDK,它提供了java的开发环境和运行环境,JDK中包含JRE
JRE是java的运行环境,是面向所有java程序的使用者,包括开发者
JVM的结构体系
方法区:
用于存储JVM加载完成的类型信息、常量、静态变量、即时编译器编译后的代码缓存,方法区和 Java 堆区一样,都是线程共享的内存区域。
在JDK8以前,使用永久代的方式来实现方法区
GC(垃圾回收机制)
https://zhuanlan.zhihu.com/p/25539690
JAVA堆(JVM堆,JAVA heap)(像string,integer,byte,shortdeng包装类型)都是存放于堆中的
堆区负责存放对象实例,当java创建一个类的实例对象或者数组时,都会在堆中为新的对象分配内存。
虚拟机只有一个堆,程序中所有的线程都共享它。
堆占用的内存空间是最多的。存取方式为管道类型,先进先出,
在程序运行中,可以动态的分配堆的内存大小
虚拟机栈(JVM栈,VM Stack)
只保存基础数据类型和对象的引用,注意只是对象的引用而不是对象本身,对象是保存在堆区中
栈内创建的基本类型数据在超出其作用域后,会被自动释放掉,它不由JVM GC管理。而在栈内创建的引用类型实例,则还是由JVM GC管理。
当一个线程创建运行的时候,与之对应的栈就创建了,每个栈中的数据都是私有的,其他线程不能访问。
每个线程都会建立一个栈,每个栈又包含了若干个栈帧,每个栈帧对应着每个方法的每次调用,栈帧包含了三个部分:
局部变量区(方法内基本类型变量、对象实例的引用)
操作数栈区(存放方法执行过程中产生的中间结果)
运行环境区(动态连接、正确的方法返回相关信息、异常捕捉)
虚拟机栈在深度溢出或扩展失败的时候,会分别抛出StackOverflowError 和 OutOfMemoryError 异常。
本地方法栈(Native Method Stack)
栈内的数据在超出其作用域后,会被自动释放掉,它不由JVM GC管理。
每一个线程都包含一个栈区,每个栈内的中的数据都是私有的,其他栈不能访问
程序计数器
在JVM的概念模型里,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令。分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。
JVM的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,为了各条线程之间的切换后计数器能恢复到正确的执行位置,所以每条线程都会有一个独立的程序计数器。
程序计数器仅占很小的一块内存空间
当线程正在执行一个Java方法,程序计数器记录的是正在执行的JVM字节码指令的地址。如果正在执行的是一个Natvie(本地方法),那么这个计数器的值则为空(Underfined)。
JVM执行引擎
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报