JVM 内存模型

JVM内存模型

JVM组成

  1. 类装载子系统
  2. 字节码执行引擎
  3. 运行时数据区(内存模型)

JVM内存模型

  1. 本地方法栈(线程独立)
  2. 栈(线程独立)
    设置一个线程栈大小参数:-Xss,默认1M
    每个线程会在栈内存区分配一块内存给本线程使用,我们叫线程栈,每个方法是一个栈帧。栈帧里面大概分4部分:局部变量表、操作数栈、动态链接、方法出口。
  3. 程序计数器(线程独立)
  4. 堆(线程共享)
    设置堆大小参数:-Xms -Xmx
  5. 方法区也叫元空间(线程共享)
    设置方法区大小参数:-XX:MetaspaceSize -XX:MaxMetaspaceSize
    使用直接内存,上限可以无限大直至撑满物理内存。
    默认值为21M。建议要设置此参数。因为初始值太小,方法区满会触发fullGC。然后回触发扩容。

GC

  1. GC Root:方法区静态变量、线程栈局部变量表、本地方法栈变量
  2. 堆中的区域分配:老年代(2/3)、新生代(Eden区(8),S0区(1),S1区(1))
    new一个对象时,先判断是不是栈上分配(逃逸分析),如果不是判断是不是大对象(可以通过参数设置阈值),大对象直接进入老年代;不是大对象进入Eden区,如果Eden区放不下,触发一次monirGC,剩余存活对象进入S0,下次再触发minorGC时同时回收Eden和S0,剩余存货对象进入S1,以此交替。每存活一次年龄+1,达到最大年龄15(可以设置进入老年大的年龄),进入老年代。如果GC之后对象还是放不下,会触发FullGC,同时回收老年代、新生代和元数据区。对象进入Eden区时,也可能根据当前存活对象大小等判断,S区放不下时,也可能直接触发FullGC。
  3. 方法区回收的无用的类需满足的条件:
    2.1 该类所有的实例对象被回收
    2.2 加载该类的classloader已经被回收
    2.3 该类的Class对象没有在任何地方引用,无法在任何地方通过反射访问该类

对象结构

  1. 对象头
    1.1 Mark Word(32位4字节,64位8字节)
    1.2 Klass Pointer类型指针(64位开启压缩4字节,关闭压缩8字节)类的元数据的指针
    1.3 数组长度(4字节,只有数组对象才有)
  2. 实例数据
  3. 对齐填充(保证是8字节的整数倍)
相关推荐
wangbing112543 分钟前
springboot应用关闭时触发动作
java·spring boot·后端
weixin_460443564 小时前
2026年新修订《网络安全法》实施:Java私有化考试系统如何做好SBOM、漏洞治理与安全升级?
java·开发语言·在线考试系统·企业培训考试系统·宏远培训考试系统·国企培训考试系统·国产化培训系统
海鸥-w7 小时前
什么是AOP
java
Cc.Y7 小时前
Java零基础入门:可变字符串与包装类:StringBuilder、StringBuffer 与 通讯录管理系统实战
java·开发语言·python
paopaokaka_luck7 小时前
基于springboot+vue的智慧家政管理系统(AI问答、 WebSocket实时沟通、ECharts运营分析、订单规则与服务追踪)
java·javascript·spring boot·数据分析·echarts·mybatis
sm_926787057 小时前
RFID 标签打印的技术实现要点与二次开发实践
java·大数据·前端·c++·编辑器
阿森_dev7 小时前
2027 届毕设选题怎么选:30 个 Java 方向选题的实现难度排序
java·开发语言·spring boot·毕业设计·课程设计
by209997 小时前
C++ 多态:同一个基类接口,调用不同的函数
开发语言·c++·经验分享·多态
笔墨登场说说8 小时前
flink bin/start-cluster.sh 帮我做成开机启动
开发语言·python
Sarvartha8 小时前
Lambda 表达式和函数式接口
java·开发语言