6. 说说Java对象创建过程
1.JVM遇到一条新建对象的指令时首先去检查这个指令的参数是否能在常量池中定义到一个类的符号引用。然后加载这个类(类加载过程在后边讲)
2.为对象分配内存。一种办法“指针碰撞”、一种办法“空闲列表”,最终常用的办法“本地线程缓冲分配(TLAB)”
- 指针碰撞:要求内存空间必须是规则且连续的,指针会指向已分配内存的末端。
- 空闲列表:内存中对象的分布不连续时,JVM就会使用空闲列表来分配对象,JVM从空闲列表中检索可用的区域来分配内存。
- JVM解决内存分配的并发安全问题的方式也有两种:
CAS:先读取当前内存地址A的值,经过JVM的预处理,然后将上次读取的值与现在内存地址A的值做比较,如果两次读到的值相同,则分配成功。
TLAB:使用CAS的方式已经相对较快,但是依旧需要进行一次Compare And Swap,还是有性能损耗。所以JVM有一个TLAB机制(Thread Local Allocation Buffer),这是一块存在于Eden区中的线程独享的内存区域,由于是线程独享的,所以并不存在并发问题,也就是快。但TLAB的默认值是Eden的1%,如果对象比较大,还是通过CAS方式在堆中分配(不一定会分配在Eden中,大对象会直接分配到老年代)。
3.将除对象头外的对象内存空间初始化为0
4.对对象头进行必要设置
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现