JVM内存分配
内存规整#
堆中的内存空间是否是规整的(连续的),由JVM垃圾收集器所采用的垃圾回收算法决定,如果垃圾回收算法是带有压缩算法的,则为连续的、规整的,如果垃圾回收算法是标记-清除算法(例如CMS收集器),则内存是不连续的、不规整的。
内存空间规整与否,决定这内存的分配方式。
内存分配方式#
指针碰撞#
内存空间是规整的,连续的内存中,一边是已分配的内存空间,一边是尚未分配的内存空间,两部分空间的中间有一个指针,通过移动指针的方式,来完成新对象实例的内存分配,这种分配方式叫指针碰撞法。
空闲列表#
内存是不规整的,只能找一块足够大的空间,分配给对象实例,这种分配方式叫空闲列表法。
并发指针碰撞问题#
同一块内存区域执行指针碰撞,会有并发问题,解决办法是:
1、为分配内存空间的动作进行同步加锁处理。
2、使用本地线程分配缓冲(TLAB,即Thread Local Allowcation Buffer)。
TLAB#
为每个线程在堆中预先分配一小块内存TLAB,线程在各自的TLAB上为自己的实例对象分配内存空间。
当TLAB使用完时,加同步锁,然后分配新的TLAB。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?