JVM
2025-02-14 11:58:41 1 举报
JVM、JMM
作者其他创作
大纲/内容
主内存
虚拟机栈中引用的对象
对象地址
JMM控制
类加载器
方法区中的常量引用的对象
共享变量副本
本地方法栈
修改
对象头header
full GC
本地方法栈中引用的对象
方法区 (元空间)
对象组成
字节码执行引擎
1 hello
局部变量是对象类型,局部变量表存放的是对象的内存地址,对象指针会指向堆内存
STW会导致系统卡顿响应变慢,那为什么还要设计STW?为了保证当前GC的对象状态不要发生变化。假设stw不停掉用户线程,用户线程和stw线程同时进行,用户线程中的对象状态是不断变换的,如果用户线程已经完成,但是GC线程还未完成,那GC永远也无法结束。(因为某个用户线程结束,非垃圾对象就会被释放变为垃圾对象,在进行GC的时候会出现这个对象一会儿是非垃圾一会儿是垃圾的情况,永远也回收不完)
可达性分析算法(寻找非垃圾对象)根据“gc root”对象作为起点对象,向下搜索引用对象,找到的对象标记为非垃圾对象,其余未标记对象为垃圾对象,可回收。
1
2 b
hello()栈帧
0 this
新生代(1/3)
操作数栈
虚拟机栈
实例数据
JMM线程内存模型
本地接口
局部变量表
共享变量
虚拟机栈(线程)
minor GC
供操作数临时做运算的中转空间
1 a
记录方法执行完之后需要执行的代码位置,返回代码的现场信息
对齐填充(保证对象为8字节整倍数)
线程B
线程C
多线程切换,记录地址位置
对象分代年龄信息存在对象内部的对象header头中
JVM虚拟机
新生代eden(8/10)
gc root包括四种对象
使用的是物理内存常量静态变量类元信息(类信息)
user
s1(1/10)
......
Java 具有四种强度不同的引用类型:强引用:被强引用关联的对象不会被回收。使用 new 一个新对象的方式来创建强引用。软引用:被软引用关联的对象只有在内存不够的情况下才会被回收。使用 SoftReference 类来创建软引用。弱引用:被弱引用关联的对象一定会被回收,也就是说它只能存活到下一次垃圾回收发生之前。使用 WeakReference 类来实现弱引用。虚引用:一个对象是否有虚引用的存在,完全不会对其生存时间构成影响,也无法通过虚引用取得一个对象。 为一个对象设置虚引用关联的唯一目的就是能在这个对象被回收时收到一个系统通知。 使用 PhantomReference 来实现虚引用。
程序计数器
运行时数据区(内存模型)
Hello.java
本地库
STWStop-The-World是在垃圾回收算法执⾏过程当中,暂停用户线程,将JVM内存冻结丶应用程序停顿的⼀种状态。jvm调优是为了减少GC次数和GC的时间,减少STW,减少暂停掉用户线程的时间。增加系统吞吐量,提高性能响应更快。
JMM线程内存模型跟CPU缓存模型类似,是基于CPU缓存模型来建立的
方法区静态变量如果是个对象,那元空间的静态变量的值存放的是对象的内存地址,对象指针会指向堆内存
堆
执行
符号对应的方法代码在方法区的内存地址
s0(1/10)
工作内存
虚拟机栈包含四个模块
方法区中类静态属性引用的对象
栈帧
垃圾收集线程
hello
main线程
互换15次
15
不是java实现的本地方法,Java内部使用
方法出口
main()栈帧
Hello.class
动态链接
线程A
老年代(2/3)
Survivor区
1、长期存活的对象2、大对象直接进入老年代3、对象动态年龄判断4、老年代空间分配担保机制
major GC
0 条评论
下一页