zoukankan      html  css  js  c++  java
  • jvm(三)对象结构以及内存分配

    对象结构

    • 对象头用于存储对象的元数据信息:

      • Mark Word 部分数据的长度在32位和64位虚拟机(未开启压缩指针)中分别为32bit和64bit,存储对象自身的运行时数据如哈希值等。Mark Word一般被设计为非固定的数据结构,以便存储更多的数据信息和复用自己的存储空间。

      • 类型指针 指向它的类元数据的指针,用于判断对象属于哪个类的实例。
        实例数据存储的是真正有效数据,如各种字段内容,各字段的分配策略为longs/doubles、ints、shorts/chars、bytes/boolean、oops(ordinary object pointers),相同宽度的字段总是被分配到一起,便于之后取数据。父类定义的变量会出现在子类定义的变量的前面。

      • 对齐填充部分仅仅起到占位符的作用

    对象的访问

    • 当我们在堆上创建一个对象实例后,就要通过虚拟机栈中的reference类型数据来操作堆上的对象。现在主流的访问方式有两种(HotSpot虚拟机采用的是第二种):

      • 使用句柄访问对象。即reference中存储的是对象句柄的地址,而句柄中包含了对象实例数据与类型数据的具体地址信息,相当于二级指针。
      • 直接指针访问对象。即reference中存储的就是对象地址,相当于一级指针。
    • 对比

      • 垃圾回收分析:方式1️⃣当垃圾回收移动对象时,reference中存储的地址是稳定的地址,不需要修改,仅需要修改对象句柄的地址;方式2️⃣垃圾回收时需要修改reference中存储的地址。

      • 访问效率分析,方式二优于方式一,因为方式二只进行了一次指针定位,节省了时间开销,而这也是HotSpot采用的实现方式。

    对象空间分配

    • Java堆内存区域的划分以及作用讲解

      • 对象分配的规则有哪些

        • 对象主要分配在新生代的 Eden 区上
        • 如果启动了本地线程分配缓冲,将按线程优先在 TLAB 上分配
        • 少数情况下也可能会直接分配在老年代中
      • GC参数指定垃圾回收

        -Xms20 M、-Xmx20 M、-Xmn1 0 M 这 3 个参数限制了 Java 堆大小为 20 MB,不可扩展,其中 10 MB 分配给新生代,剩下的 10 MB 分配给老年代。-Xx: SurvivorRatio= 8 决定了新生代中 Eden 区与两个 Survivor 区的空间比例是 8:1

    • 新生代与老年代

      新生代 GC (Minor GC):指发生在新生代的垃圾收集动作,因为 Java 对象大多都具备朝生夕灭的特性,所以 Minor GC 非常频繁,一般回收速度老年代 GC (Major GC/ Full GC):指发生在老年代的 GC,出现了 Major GC,经常会伴随至少一次的 Minor GC(但非绝对的,在 Parallel Scavenge 收集器的收集策略里就有直接进行 Major GC 的策略选择过程)。Major GC 的速度一般会比 Minor GC 慢 10 倍以上。
      是什么?

    堆内存JVM参数讲解,大对象分配原则讲解

    • 所谓的大对象是指,需要大量连续内存空间的 Java 对象,最典型的大对象就是那种很长的字符串以及数组

    • 虚拟机提供了一个-XX: PretenureSizeThreshold 参数,令大于这个设置值的对象直接在老年代分配。这样做的目的是避免在 Eden 区及两个 Survivor 区之间发生大量的内存复制

    • 实战代码演练大对象配置

      • -verbose:gc -XX:+PrintGCDetails 开启GC日志打印

      • -Xms20 M 设置JVM初始内存为20M

      • -Xmx20 M 设置JVM最大内存为20M

      • -Xmn10 M 设置年轻代内存大小为10M

    -verbose:gc -XX:+PrintGCDetails -XX:+UseSerialGC -Xms20M -Xmx20M -Xmn10M -XX:PretenureSizeThreshold=3145728
    
  • 相关阅读:
    one-hot 编码
    typeError:The value of a feed cannot be a tf.Tensor object.Acceptable feed values include Python scalars,strings,lists.numpy ndarrays,or TensorHandles.For reference.the tensor object was Tensor...
    tensorflw-gpu 运行 。py程序出现gpu不匹配的问题
    空间金字塔池化 ssp-net
    随便说一说bootstrap-table插件
    初识 .NET平台下作业调度器——Quartz.NET
    在VS中关于MySQL的相关问题
    教你记住ASP.NET WebForm页面的生命周期
    国内流行的两大开源.net微信公众平台SDK对比分析
    一次利用MSSQL的SA账户提权获取服务器权限
  • 原文地址:https://www.cnblogs.com/linmsen/p/11729578.html
Copyright © 2011-2022 走看看