Java对象的创建
类的创建过程
- new一个对象时,首先检查该指令的参数是否能在常量池中定位到一个类的符号引用
- 检查该符号引用代表的类是否已被加载、解析和初始化。若没有,则执行相应的类加载过程。
- 类加载检查通过后,进行内存的分配。
- 将分配到的内存空间(不包括对象头)都初始化为零值。
- 对对象进行必要的设置(设置对象头信息)。
- 执行构造函数。
为对象分配内存的方式
-
指针碰撞
假设Java堆中内存是绝对规整的,所有被使用过的内存都被放在一边,空闲的内存被放在另一边,中间放着一个指针作为分界点的指示器,那所分配内存就仅仅是把那个指针向空闲空间方向挪动一段与对象大小相等的距离。
-
空闲列表
如果Java堆中的内存并不是规整的,虚拟机就必须维护一个列表,记录上哪些内存块是可用的,在分配的时候从列表中找到一块足够大的空间划分给对象实例,并更新列表上的记录。
选择哪种分配方式由Java堆是否规整决定,而Java堆是否规整又由所采用的垃圾收集器是否带有空间压缩整理的能力决定。
解决分配内存线程不安全问题的方法
-
对分配内存空间的动作进行同步处理
CAS+失败重试
-
把内存分配的动作按照线程划分在不同的空间中进行
本地线程分配缓存(TLAB)
本文作者:aosrc
本文链接:https://www.cnblogs.com/aosrc/p/15756629.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现