0
点赞
收藏
分享

微信扫一扫

内存栈溢出

码农K 2021-10-09 阅读 48
随笔

stackoverFlow  :无限递归

oufOfMemory:不断创建线程,线程占用空间


new 一个对象的流程?(虚拟机中对象的创建过程)

类加载----》检查加载------》分配内存------》内存空间初始化-----》设置------》对象初始化--->线程栈栈新建对象引用

(1)当一个虚拟机接收到一条new 指令的时候,首先从常量池中检查是否能定位到一个该类的符号引用,(即带路径的全类名),并且检查这个类是否被初加载、解析、始化过,即验证这类是否是第一次使用,如果没有,那必须的要先进性类的加载过程。

(2)类加载完成后,接下来虚拟机为新生的对象分配内存,其实在类加载的时候就已经确定了该分配多大的内存,这个分配内存的方式主要根据jvm内存回收机制来确定,

1)指针碰撞:如果原来的空间是规整的,即将存放内存空间与空闲空间分开,用过的放一边,空闲的放一边,,中间有一个指针作为分界点指示器,那进行对象内存分配的时候,就是将指针移向空闲一侧,移动大小等于该分配对象内存的大小。

2)空闲列表:如果堆中的内存空间不是规整的,那么需要维护一个空闲列表,来记录当前还有哪些空间是空闲的,为对象分配内存的时候,需要从列表中找到一个合适大小的内存空间,分配给该对象。

(3)内存分配后,虚拟机将分配到内存空间的数据类型都进行初始化默认值。(不包含对象头)

(4)虚拟机要进行对象头信息设置,包含对象是哪个类的实例,如何才能找到类的元数据信息,对象的hash值,对象的gc分代年龄,这些信息都需要存放在对象的头信息中。

(5)调用对象的init方法,根据对象传入的属性值给属性赋值,

(6)在线程栈中新建对象引用,并将引用指到堆内存的对象地址上。

举报

相关推荐

0 条评论