JVM内存模型

运行时数据区域划分

方法区、堆区、虚拟机栈、本地方法栈、程序计数器

JDK1.8前:线程共享(Heap堆区、方法区)、线程私有(虚拟机栈、本地方法栈、程序计数器)

JDK1.8后:线程共享(Heap堆区、元空间)、线程私有(虚拟机栈、本地方法栈、程序计数器)

程序计数器

是当前线程所执行的字节码的行号指示器

每当需要执行一条字节码指令时,就通过改变程序计数器的值来完成。程序中的分支、循环、跳转、异常处理、线程恢复等功能都需要依赖这个计数器来完成

不会出现内存溢出,随线程的创建而创建,随线程的死亡而死亡

Java 虚拟机栈(VM Stack)

由很多栈帧组成,每个栈帧由局部变量、操作数栈、动态链表和方法返回四部分组成虚拟机栈是线程私有区域,并且栈帧不允许被其他线程访问,不存在线程安全和垃圾回收问题。

可能会出现错误:栈溢出和内存溢出

虚拟栈通过-Xss设置参数

本地方法栈

可能会出现错误:栈溢出和内存溢出

堆

用于存放对象实例和数字的内存区域

"几乎"所以的对象实例以及数组都在这里分配空间

堆区的组成:新生代+老年代

新生代(1/3)、老年代(2/3)目的为了更好的会内存,或更快分配内存

新生代分为伊甸区和幸存区(8:1:1)--幸存区放Minor GC和没有被回收的对象

老年代:放Minor GC之后且年龄计数器达到15依然存活的对象、Major GC和Full GC之后依然存活的对象。

堆空间的大小设置

-Xms:初始堆内存

-Xmx:最大堆内存

-Xmn:新生代内存

创建对象的内存分配

对象在伊甸区生成,当伊甸区填满的时候,会触发YGC,YGC垃圾回收的时候,在伊甸区实现清楚策略,没有被引用的对象直接回收。

依然存活的对象会被移送到幸存区(分为S0、S1),当YGC时候,将存活对象复制到未使用的幸存空间,将正在使用的空间完全清除,交换两块空间的使用状态,每次交换,年龄+1。

如果YGC要移送的对象大于幸存区容量的上限,则直接交给老年代。一个对象不会永远在新生代,在JVM中一个对象从新生代晋升到老年代的阈值是15,可以在幸存区交换14次后,晋升到老年代。

堆区的分代垃圾收集思想
部分收集

新生代:YGC、老年代:FGC、混合收集:G1收集器

整堆收集

FGC:回收整个Java堆区,默认堆空间达到80%会触发。很少会触发,基本是10天半个月。

GC垃圾回收的影响

耗时太长、次数太多会影响进程的性能,导致进程响应变慢,或无法响应。

产生FGC原因

大对象、内存泄漏、程序频繁生成一些长生命周期的对象(存活年龄超过分代年龄便会进入老年代)、程序BUG倒是动态生成了很多新类、JVM参数设置不合理。

产生错误

内存溢出(堆内存不足、JVM花时间太长,只能回收很少堆空间)

元空间

存放类信息、常量、静态变量、JIT即时编译器编译后的机器代码等数据。

1.6:方法区

1.7:将字符串常量池、静态变量转移到了堆区。

1.8:元空间

字符串常量池

第一种方式是在常量池中获取字符串对象;

第二种方式是直接在堆内存空间创建一个新的字符串对象;

String 的intern( )方法:

检查指定字符串在常量池中是否存在?如果存在,则返会地址,如果不存在,则在常量池中创建。

相关推荐
机器人零零壹1 小时前
技术白皮书:iRobotCAM如何解决机器人激光切割应用中的核心难点,从CAD离线编程到双目视觉定位与轨迹自适应提升复杂空间曲线切割的精度、效率与柔性化水平
人工智能·算法
AI你一生一世3 小时前
不止于时序存储:DolphinDB 如何成为 AI 时代的工业智能底座
java·人工智能·struts·时序数据库·工业智能·dolphindb·ai基础设施
云-缩影3 小时前
拆解 AI 图像生成应用的后端架构:ECS、OSS 和大模型 API 怎么配合
java·spring boot·后端
瑞克-桑切斯3 小时前
7、MySQL 慢查询排查与优化实战指南
java·服务器·数据库
ZhengEnCi4 小时前
大模型的分类到底怎么分:从基础模型到推理模型、从通用到专用的完整图谱
算法
取名真是5 小时前
Python 算法知识点从基础到进阶
开发语言·python·算法
罗西的思考5 小时前
【轻量化复刻大模型 / KIMI K3】KDA 模块交互式演示
人工智能·算法·机器学习
nm_zfyjt7 小时前
信息流广告投放优化实践:线索成本评估模型与转化链路重构(家装建材案例)
算法·重构·内蒙古朋友圈广告服务商·内蒙古朋友圈获客
海的透彻7 小时前
dockerfile如何快速构建容器(java服务)
java·开发语言
code2cat8 小时前
Java工具篇之Gradle:用任务图组织构建与交付
java·开发语言·单元测试·gradle