美文网首页
Java JVM中的对象内存分配 泛型

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

作者: 攻城狮托马斯 | 来源:发表于2020-05-18 15:56 被阅读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了.

    相关文章

      网友评论

          本文标题:Java JVM中的对象内存分配 泛型

          本文链接:https://www.haomeiwen.com/subject/rzqeohtx.html