JVM线程
1.JVM概念
包括一套字节码指令集 一组寄存器 一个栈 一个垃圾回收 一个堆 一个存储方法域。
Java源文件(通过编译器)-> 字节码文件(通过JVM)-> 机器码
1.1 子系统
- ClassLoader类加载:根据给定的全限定类名来装载class文件到Runtime data area中的method area
- ExecutionEngine 执行引擎:执行classes中的指令
1.2 组件
- Runtime data area 运行时数据区:JVM内存
- Native Interface 本地接口:与native libraries交互,是其他编程语言交互的接口
1.3 流程
编译器将Java代码转化为字节码,类加载器再把字节码加载到内存中,将其放在运行时数据区的方法区,字节码文件只是JVM的一套指令集规范,并不能直接交给底层操作系统去执行,因此需要特定命令解释器引擎,将字节码翻译成底层系统指令,再交由CPU执行,需要调用其他语言的本地库接口来实现整个程序功能
2.线程
JVM允许一个应用并发执行
3.内存区域
3.1 线程私有区域 Thread Local
3.2 线程共享区域 Thread Shared
3.2.1 方法区(永久代)
用于存储被JVM加载的类信息,常量,静态变量,被编译器编译后的代码等数据。Class在被加载时候被放入永久区域,GC不会在主程序运行期间对永久代区域进行清理,最终会OOM异常。
- Java8中,永久代被移除,被元数据区取代,其不在虚拟机中,使用本地内存。
3.2.2 类实例区(Java堆)
-
新生代
存放新生对象 占据1/3空间,会频繁触发MinorGC进行垃圾回收
分为Eden,ServivorFrom,ServivorTo三个区
-- Eden: 新对象的出生地(占用内存大直接分配老年代),内存不够触发MinorGC,对新生代进行垃圾回收。
-- SurvivorFrom:上一次GC的幸存者,作为这次GC被扫描者
-- SurvivorTo: 保留了一次MinorGC过程中的幸存者
俩个Survivor意义:减少被送往老年代对象,进而减少GC发生,预筛选保证,只有经历过15次MinorGC还能在新生代存活的对象才会送往老年代。 -
老年代
存放生命周期长的内存对象,比较稳定。进行MajorGC前一般先进行MinorGC。无法找到足够大的连续空间分配给新建的较大对象也会触发MajorGC进行垃圾回收 -
异常
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律