jvm(更新中)

类加载

加载的类信息存放在方法区。

加载阶段

通过类加载器将class文件加载到内存中生成class对象。

类加载器有三类,从上到下依次是启动类加载器(加载核心类库rt.jar下的类)、扩展类加载器(加载扩展包类库比如ext目录下的类)、应用程序类加载器。

双亲委派机制:类加载器收到类加载请求时,现将该类委托给父类加载器加载,父类加载器判断是否可以加载该类以及该类是否被加载,如果可以加载则直接加载,否则交给子类尝试加载。

好处:防止重复加载、防止核心类库被修改。

链接阶段

验证

验证加载的class文件的正确性。

准备

为静态变量分配内存并赋初始值。

解析

将常量池的符号引用转化为直接引用。

比如类中某个方法用到了System.out...,System在类文件中暂时用符号引用表示,在解析阶段就会转为直接应用,即指向方法区中System的具体地址。

初始化阶段

执行静态变量的赋值操作与静态代码块。

运行时数据区

PC寄存器

生命周期与线程一致。

存储执行引擎要执行的下一条字节码指令的地址。

CPU从执行A线程到执行B线程再回到执行A线程时,通过PC寄存器可以从上一次执行的位置继续执行。

虚拟机栈

生命周期与线程一致。

java的方法执行在虚拟机栈中进行,方法的调用对应栈帧的入栈,方法执行结束对应栈帧的出栈。

栈帧中保存局部变量等值。

如果虚拟机栈的大小可以动态扩展,当栈内存不足申请内存时如果申请失败,回报内存溢出。

如果虚拟机栈的大小是固定的,当方法不断递归调用导致大量栈帧入栈,超过虚拟机栈的固定大小时,会报栈溢出。

-Xss 虚拟机栈大小,JDK8默认固定1m

方法区

所有线程共享,生命周期与JVM一致。

JDK7及以前通过永生代实现的方法区,永生代内存在JVM中;JDK8及以后通过元空间使用方法区,元空间在本地内存中,不属于JVM内存。

局部变量的引用指向堆中对象的地址,堆中对象存在指针,指向方法区中类信息的地址。

-XX:MetaspaceSize 元空间初始内存,默认20m

-XX:MaxMetaspaceSize 元空间最大内存,默认-1,代表无限制。

方法区中保存类信息、即时编译器编译后的代码等,静态变量与字符串常量池仍在堆中。

堆区

生命周期与JVM一致。

-Xms 初始堆大小,默认物理内存/64

-Xmx 最大堆大小,默认物理内存/4

-Xmn 新生代大小,老年代=-Xmx - -Xmn

初始堆与最大堆最好设置一致,最大堆最好不超过物理内存的一半,留一半给系统和其他进程。

堆区按照垃圾回收可以分为新生代与老年代,新生代又可以分为eden区、survivor0区、survivor1区。默认新生代占三分之一,老年代占三分之二。Eden区与两个survivor区的比例为8:1:1。

当eden区满时,清理eden区与幸存者1区的垃圾对象,将两个区的存活对象放到幸存者2区,对象年龄加1;

下一次再当eden区满时,清理eden区与幸存者2区的垃圾对象,将两个区的存活对象放到幸存者1区,对象年龄加1,当存活对象的年龄到达15时,将对象放到老年代。

如果是超大对象,eden区存放不下的时候,会直接放到老年代,老年代也放不下会触发major GC,如果还是放不下,报OOM内存溢出。

Full GC:完成整个堆与方法区的垃圾回收。

Young GC、Old GC会触发STW,即暂停其他用户线程。

执行引擎

将字节码翻译成对应操作系统能够识别的机器指令。

本地方法接口

本地方法栈

相关推荐
minji...3 小时前
Linux 线程同步与互斥(二) 线程同步,条件变量,pthread_cond_init/wait/signal/broadcast
linux·运维·开发语言·jvm·数据结构·c++
woai33644 小时前
JVM学习-基础篇-常见引用
jvm·学习
それども5 小时前
理解JVM参数 Xss 线程的栈大小
jvm
玛卡巴卡ldf5 小时前
【Springboot6】内存泄漏OOM、VisualVM、Arthas、Prometheus Grafana监控、垃圾回收
java·jvm·springboot
一个有温度的技术博主5 小时前
深入多级缓存:JVM进程缓存实战与数据库表拆分策略
jvm·数据库·缓存
码云数智-园园6 小时前
C# 内存模型的基石:值类型与引用类型的深度博弈
java·开发语言·jvm
Engineer邓祥浩6 小时前
JVM学习笔记(7) 第三部分 虚拟机执行子系统 第6章 类文件结构
jvm·笔记·学习
大黄说说7 小时前
深入.NET内存模型:垃圾回收(GC)机制与性能优化指南
java·jvm·算法
搜佛说1 天前
比SQLite更快,比InfluxDB更轻:sfsDb的降维打击
jvm·数据库·物联网·架构·sqlite·边缘计算·iot
阿捞21 天前
JVM排查工具单
java·jvm·python