Java JVM中的对象内存分配 泛型

2020-05-18  本文已影响0人  攻城狮托马斯

StackOverFlow和OutOfMemory


StackOverFlow发生在虚拟机栈中放入的方法过多而导致栈溢出, 而OutOfMemory则是虚拟机栈中的内存溢出

JVM中对象分配内存步骤


首先,会进行类加载,然后通过指针(指着下一个空闲区域在哪),或者空闲列表,显示哪些内存有空闲. 

指针碰撞: Java堆内存空间规准下使用.

空闲链表:java堆空间不规整情况下使用.

分配内存(内存抢占): 在高并发环境下, 通过CAS对比来确定哪一块内存已经被成功抢占.

内存空间初始化: 放入type默认的值,比如说int  = 0, 然后boolean = false等

设置: 设计对象元数据和Hash值,垃圾回收分代和年龄等


对象头和实例数据

对象头:hashCode/GC垃圾回收(年龄), 以及线程持有锁,偏向线程id,偏向时间戳,类型指针(指向哪个类). 对象填充:对象头都是8个字节,如果少了会自动填充.

对象访问方式:句柄和直接访问.

堆内存分配


堆内存分为新生代和老年代,其中新生代中按照(8:1:1)来分配Eden, from, to. 

对象优先在Eden中分配, 如果对象大于某一个限定的值, 则自动进入老年代。

当Eden区满了之后,便会触发一次minor GC, 存活下来的则进入from或to区, 更新年龄。

https://blog.csdn.net/yubujian_l/article/details/80804708

长期存活的对象则进入老年代, 大对象直接进入老年代

动态年龄判断

如果From区满了, 但每一个元素同时达到年龄, 则提前进入老年代. 当老年代满的时候就触发Full GC

空间担保机制

每一次放入老年代都不检查老年代剩余空间, 这样每一次不用检查并full gc. 直到满了再full gc.

泛型


Java中定义的参数化类型(Type Parameter), 最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。

Java泛型设计原则:只要在编译时期没有出现警告,那么运行时期就不会出现ClassCastException异常.

泛型的实现方法通常有泛型类,和泛型接口

泛型的好处

1.适用于多种数据类型执行相同的代码

2.指定类型后,不需要强制的转换.

泛型的上下界

https://blog.csdn.net/dehuai19940321/article/details/102346727

实现方法一: 通过实现接口,在constructor中引入一个变量.

实现方法二: 直接在接口中传入类型. 

虚拟机如何使用泛型


JVM中都会把泛型变为Object, 进行类型擦除. 比如,以下Override会报错, 

因为JVM把String和Integer当作Object了.

上一篇下一篇

猜你喜欢

热点阅读