逐级包含的关系
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aiU5livF-1631777832730)(images/20210207154634171.png)]](https://1000bd.com/contentImg/2024/03/29/d212eaeb2460e86f.png)
不同的公司只要遵循虚拟机规范,都可以自己实现



Program Counter Register 程序计数器(寄存器)
是记录下一条 jvm 指令的执行地址行号


不会,栈内存是方法调用产生的,方法调用结束后会弹出栈
不是。物理内存是一定的,栈内存越大,可以支持更多的递归调用,但是可执行的线程数就会越少。因为线程执行时,调用方法需要申请栈帧内存,单个栈帧内存越大,可申请到的栈帧就越少。Xss 1m:用来设置栈内存大小


案例1:cpu占用过多
定位:
top命令:查看是哪个进程占用资源过高
ps H -eo pid,tid,%cpu | grep 进程id:定位具体是哪个线程引起的占用cpu过高
jstack 进程id (需要将十进程线程号转换成十六进制号)




案例2:程序运行很长时间都没有得到自己想要的结果(线程死锁)



不是由Java代码实现的方法,是给本地方法执行的时候提供内存空间
a = a + a进行字符串拼接,每次拼接都会生成新的字符串对象,而且arrayList集合一直处于引用范围之内,就导致垃圾回收不了


查找出最大的对象

可以发现其中最大的属性值是哪一个,可以发现每一个age属性都有1m多,总共创建了999个对象


线程共享
存储类的结构相关信息
虚拟器启动时创建,逻辑上是堆的一部分,根据虚拟机厂商来进行实现(hotspot 1.8以前是永久代,1.8之后是元空间,使用的操作系统的内存,不使用jvm来管理内存了)
也会导致内存溢出

-XX: MaxMetaspaceSize=8m 调整方法区的大小(默认使用的系统内存,很难演示出元空间OOM),我这里只测出了Compressed Class space的异常。

Compressed Class Space OOM 异常,网上搜寻了这么多文档,我自己理解来看,在64位的操作系统中需要开启class对象指针压缩,如果不压缩,有可能导致指针膨胀进而消耗内存,而Compress空间就是用来保存压缩指针后的class对象。而64位操作系统中,其地址总线是64根,所以在计算内存单元的寻址时需要将32位的进行计算成64位的进行操作,因为32位的cpu寻址能力大概为4G,而64位的寻址能力达到了上百万T。所以就需要进行计算。(详细请看我汇编语言中CPU寻址方式)。而且Compressed的空间跟元空间的大小设置应该是一起的,所以就会导致一直是Compressed Class Space OOM。将 Compressed压缩指针选项关掉,就会出MetaSpace OOM的异常了
参考文档:https://cloud.tencent.com/developer/article/1408827
理解不对,请大佬们轻喷。
javap -v .class 可以查看类的基本信息。
就是一张表,虚拟机会根据指令去常量表中找到需要执行的类名,方法名称、参数类型、字面量等信息
常量池是 *.class文件中的,当该类被加载,它的常量信息就会被放入运行时常量池,并把里面的符号地址变为真实地址