Jvm-对象探秘

  • 1.对象加载方式

  (《深入理解Java虚拟机:JVM高级特性与最佳实践》笔记)

    1.对象的创建:当虚拟机接受一条new对象的指令时(限于java对象,不包括数组,Class对象等...)会经历如下步骤:

      (1)检查这个指令的参数是否在常量池(运行时常量池)中定义到一个类符号的引用。

      (2)检查这个符号代表的类时候被加载、解析或者初始化过(类的加载流程),否则会通过classLoader尝试加载

      (3)在类的加载检查通过后,尝试为新对象分配内存空间。由于类的大小可以在类加载完成后完全确定,所以为对象划分空间,就相当于把一块固定大小的内存容量从本地内存(1.8使用的是本地内存而不是jvm的内存)中划分出来。那么就会因为GC是否拥有压缩整理算法而产生不同的分类方式

      1.指针碰撞:如果java中的堆内存空间是整齐的,所有用过的内存放在一边,没有用过的也放在一边,中间使用一个指针作为临界点的指示器。这样分配内存就相当于移动指针和对象相同的大小距离。

      2.空闲列表:如果java中的堆内存空间不是整齐的,用过的和未用过的内存空间相互交错!那么就不能使用指针碰撞的方式了,虚拟机就必须维护一个空闲列表,记录那些空间是可用的以及大小,为分配时从列表中找到足够大的空间,分配给对象,并更新表信息。

          

  

    

猜你喜欢

转载自www.cnblogs.com/liufeifeifei/p/10503878.html