执行引擎
CodeCache 相对于其他内存(可读可写,可执行)
操作系统内存模型和JVM内存模型之间的关系;
操作系统内存模型
堆区
JVM内存模型,其实就是从堆区切了一块大内存下来(内存池)
堆区
方法区(jdk7)
虚拟机栈
本地方法栈
程序计数器
方法区(jdk8)
-----------------------
栈
全局区
代码块
IDEA点执行main函数:先javac编译,在java执行
JVM启动
JVM初始化
HSDB 窥探JVM内部 (类比HSDIS)
oop-klass模型
klass模型:Java的类在JVM中的存在形式
因为openJDK是用汇编、c、c++写的,JVM不认识java类的,需要 Java类->C++类,在JVM内部流通
类加载器
七个阶段:
类何时被加载,何时被解析
初始化到底是什么
三个类加载器
双亲委派
SPI
自定义类加载器
字节码文件(.class)加载入JVM中是如何存储的?
字节流:ClassFileStream* cfs = stream();
基于《Java虚拟机规范》对这个stream进行解析
1、InstanceKlass存储java类的元信息(方法区,不是Class对象)
2、InstanceMirrorKlass镜像类(堆区,Class对象)
静态属性,在堆区
一、
方法区:Java虚拟机规范(接口)
永久代
元空间:方法区在JVM中的具体实现(接口实现类)
方法区还有 CodeCache:存储即时编译(JIT)后生成的机器码,也属于调优的一部分
1、永久代:jdk7以前方法区的具体实现,JVM内存模型的堆区(不是操作系统的堆区)
2、元空间:jdk8及以后方法区的具体实现,在操作系统的堆区(OS Memory、Native Memory)
大小是多少:MetaspaceSize MaxMetespaceSize
java -XX:PrintFlagFinal -version | grep Metaspace
2.1、JVM调优参数三种类型:
-XX:key=val
-XX:+/-param
-Xmx -Xms 调优堆的 (eg:-Xmx10m -Xms10m 设置10m)
OOM
eg:模拟元空间OOM的程序: 利用CGLib库,
3、如何调优:
-XX:MetaspaceSize=20m
-XX:MaxMetespaceSize=20m
3.1、元空间的调优规则
3.1.1、最大、最小设置成一样大 防止内存抖动 带来了内存忽大忽小
3.1.2、至少预留20%的空间(为了安全)
VisualVM是如何监控其他Java程序吗? java agent(java调试器的底层实现原理) 本地用
arthas 黑窗口,线上用 阿里的
二、
本地方法栈:java程序调用c、c++写的动态链接库运行时需要的栈
JNI 目前只有底层会使用:Android需要操作硬件
socket 现在都是socket, 兼容性好, java写的服务端,c、c++、Python、go写的客户端, 网络,Linux
计算机语言是虚拟的,为什么能操控硬件:电流图、编程图 eg:点亮LED灯等。用0、1控制
问题:
1、一个jvm中有几个虚拟机栈:一个线成一个
TLAB 堆, 是线成私有堆(新生代)
PLAB 线程私有堆(老年代)
2、一个虚拟机栈有几个栈帧? 方法的调用次数
三、
虚拟机栈
栈帧:局部变量表、操作数栈、动态链接、返回地址
1、动态链接:java的类方法对象的C++对象再方法区的内存地址
Java的类方法在JVM中是如何存储的
2、返回地址(add方法);存储的是调用方的程序计数器 存储的是main方法的程序计数器
程序计数器:如果是操作系统级别,那就是寄存器EIP(32bit)、RIP(64bit) 如果是JVM,字节码指令的index
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现