网站建设项目管理绩效情况分析建设网站主机可以用吗

当前位置: 首页 > news >正文

网站建设项目管理绩效情况分析,建设网站主机可以用吗,培训网页设计,互联网产品运营java对象内存结构Java对象保存在堆中时#xff0c;由三部分组成#xff1a;对象头#xff08;object header#xff09;#xff1a;包括了关于堆对象的布局、类型、GC状态、同步状态和标识哈希码的基本信息。所有java对象都有一个共同的对象头格实例数据#xff08;Insta…java对象内存结构Java对象保存在堆中时由三部分组成对象头object header包括了关于堆对象的布局、类型、GC状态、同步状态和标识哈希码的基本信息。所有java对象都有一个共同的对象头格实例数据Instance Data主要是存放类的数据信息父类的信息对象字段属性信息。数据长度(array length):记录了数组的长度只有对象是数组时才有这个结构。对齐填充Padding为了字节对齐成的8倍数填充的数据不是必须的。什么是对象头 我们可以在Hotspot官方文档中找到它的描述。从中可以发现它是Java对象和虚拟机内部对象都有的共同格式由两个字(计算机术语)组成。另外如果对象是一个Java数组那在对象头中还必须有一块用于记录数组长度的数据因为虚拟机可以通过普通Java对象的元数据信息确定Java对象的大小但是从数组的元数据中无法确定数组的大小。它里面提到了对象头由两个字组成这两个字分别是 mark word和 klass pointer。什么是mark word 用于存储对象自身的运行时数据如哈希码HashCode、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等等。Mark Word在32位JVM中的长度是32bit在64位JVM中长度是64bit。虽然它们在不同位数的JVM中长度不一样但是基本组成内容是一致的。锁标志位lock区分锁状态11时表示对象待GC回收状态, 只有最后2位锁标识(11)有效。biased_lock是否偏向锁由于正常锁和偏向锁的锁标识都是 01没办法区分这里引入一位的偏向锁标识位。分代年龄age表示对象被GC的次数当该次数到达阈值的时候对象就会转移到老年代。对象的hashcodehash运行期间调用System.identityHashCode()来计算延迟计算并把结果赋值到这里。当对象加锁后计算的结果31位不够表示在偏向锁轻量锁重量锁hashcode会被转移到Monitor中。偏向锁的线程IDJavaThread偏向模式的时候当某个线程持有对象的时候对象这里就会被置为该线程的ID。 在后面的操作中就无需再进行尝试获取锁的动作。epoch偏向锁在CAS锁操作过程中偏向性标识表示对象更偏向哪个锁。ptr_to_lock_record轻量级锁状态下指向栈中锁记录的指针。当锁获取是无竞争的时JVM使用原子操作而不是OS互斥。这种技术称为轻量级锁定。在轻量级锁定的情况下JVM通过CAS操作在对象的标题字中设置指向锁记录的指针。ptr_to_heavyweight_monitor重量级锁状态下指向对象监视器Monitor的指针。如果两个不同的线程同时在同一个对象上竞争则必须将轻量级锁定升级到Monitor以管理等待的线程。在重量级锁定的情况下JVM在对象的ptr_to_heavyweight_monitor设置指向Monitor的指针。Klass Pointer即类型指针是对象指向它的类元数据的指针虚拟机通过这个指针来确定这个对象是哪个类的实例。实例数据 如果对象有属性字段则这里会有数据信息。如果对象无属性字段则这里就不会有数据。根据字段类型的不同占不同的字节例如boolean类型占1个字节int类型占4个字节等等对齐填充 对象可以有对齐数据也可以没有。默认情况下Java虚拟机堆中对象的起始地址需要对齐至8的倍数。如果一个对象用不到8N个字节则需要对其填充以此来补齐对象头和实例数据占用内存之后剩余的空间大小。如果对象头和实例数据已经占满了JVM所分配的内存空间那么就不用再进行对齐填充了。所有的对象分配的字节总SIZE需要是8的倍数如果前面的对象头和实例数据占用的总SIZE不满足要求则通过对齐数据来填满。为什么要对齐数据 字段内存对齐的其中一个原因是让字段只出现在同一CPU的缓存行中。如果字段不是对齐的那么就有可能出现跨缓存行的字段。也就是说该字段的读取可能需要替换两个缓存行而该字段的存储也会同时污染两个缓存行。这两种情况对程序的执行效率而言都是不利的。其实对其填充的最终目的是为了计算机高效寻址。java对象大小的计算(我是64位计算机 JDK8)maven 引入如下jar包 dependencygroupIdorg.openjdk.jol/groupIdartifactIdjol-core/artifactIdversion0.16/version/dependencydemo codepublic class ObjectTest {public static void main(String[] args) {System.out.println(*************没属性****************);testOne testOne new testOne();System.out.println(ClassLayout.parseInstance(testOne).toPrintable());System.out.println(**********有属性****************);testTwo testTwo new testTwo();System.out.println(ClassLayout.parseInstance(testTwo).toPrintable());System.out.println(**********有数组****************);testTwo[] testTwoArr new testTwo[]{new testTwo(),new testTwo()};System.out.println(ClassLayout.parseInstance(testTwoArr).toPrintable());} }class testOne{}class testTwo{private int a;} 结果含义OFF : 偏移地址单位字节 SZ :占用的内存大小单位为字节TYPE DESCRIPTION : 类型描述 其中object header:mark为对象头的markword 其中object header:class为对象头的klass pointer 其中 object alignment gap 为对齐填充 其中array length 为数组长度由于jdk默认开启了指针压缩。 所以我们能看到object header: class 变成了4个字节。 对象头占了12个字节 可以通过配置vm参数开启关闭指针压缩-XX:-UseCompressedOops。这时候对象头变成了16个字节**********无属性******************* com.tongji.testOne object internals: OFF SZ TYPE DESCRIPTION VALUE0 8 (object header: mark) 0x0000000000000001 (non-biasable; age: 0)8 4 (object header: class) 0xf800c24412 4 (object alignment gap)
Instance size: 16 bytes Space losses: 0 bytes internal 4 bytes external 4 bytes total 1.对象头mark 8个字节对象头 klass pointer 4个字节12字节 2.由于12不是8的整数被所以需要把12填充到8的倍数 3.最接近12的能被整除的是16故需要填充4个字节 16-124字节。*************有属性******************* com.tongji.testTwo object internals: OFF SZ TYPE DESCRIPTION VALUE0 8 (object header: mark) 0x0000000000000001 (non-biasable; age: 0)8 4 (object header: class) 0xf800cfce12 4 int testTwo.a 0 Instance size: 16 bytes Space losses: 0 bytes internal 0 bytes external 0 bytes total 1.对象头mark 8个字节对象头 klass pointer 4个字节12字节 2.类中int 占4个字节 3.12416个字节 能被8整除故不需要填充*************数组******************* [Lcom.tongji.testTwo; object internals: OFF SZ TYPE DESCRIPTION VALUE0 8 (object header: mark) 0x0000000000000001 (non-biasable; age: 0)8 4 (object header: class) 0xf800d0dc12 4 (array length) 212 4 (alignment/padding gap) 16 8 com.tongji.testTwo testTwo;.elements N/A Instance size: 24 bytes Space losses: 4 bytes internal 0 bytes external 4 bytes total1.对象头mark 8个字节对象头 klass pointer 4个字节12字节 2.array length 占4个字节 3.elements 占8个字节 4.124824字节GC年龄为啥最大是15大家猜猜是为啥 看到前面的对象头的mark word 大家肯定都知道了 GC年龄无论在32位还是64位计算机只占了4位其最大值也就是 1111(二进制)2^4-115.平常常用的hashCode藏在哪里