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

如何进行电商网站设计开发wordpress lofter主题

如何进行电商网站设计开发,wordpress lofter主题,重庆网站快速优化排名,全网营销系统前言 作为一个 Java 程序员#xff0c;我们在开发中最多的操作要属创建对象了。那么你了解对象多少#xff1f;它是如何创建#xff1f;如何存储布局以及如何使用的#xff1f;本文将对 Java 对象进行揭秘#xff0c;以及讲解如何使用 JOL 查看对象内存使用情况。 本文是基…前言 作为一个 Java 程序员我们在开发中最多的操作要属创建对象了。那么你了解对象多少它是如何创建如何存储布局以及如何使用的本文将对 Java 对象进行揭秘以及讲解如何使用 JOL 查看对象内存使用情况。 本文是基于 HotSpot 64 位虚拟机。 一、对象是如何创建的 1. 类加载检查 虚拟机遇到一条 new 指令时首先将去检查这个指令的参数是否能在常量池中定位到这个类的符号引用并且检查这个符号引用代表的类是否已被加载过、解析和初始化过。如果没有那必须先执行相应的类加载过程。 关于如何加载详情见 JVM 类加载机制。 2. 分配内存空间 在类加载检查通过后接下来虚拟机将为新生对象分配内存。对象所需的内存大小在类加载完成后便可确定如何确定见下方对象的存储布局。 为对象分配空间的任务等同于把一块确定大小的内存从 Java 堆中划分出来。 根据Java 堆中的内存是否完整可分为“指针碰撞” 和 “空闲列表” 两种分配方式。 分配方式原理使用场景特点指针碰撞使用过的内存放到一边未使用过的内存放在另一边。中间放一个指针作为分界点然后向空闲区域移动与对象大小相等的距离。堆内存完整简单高效空闲列表虚拟机维护一个列表记录上哪些内存块是可用的在分配的时候找足够大的内存块儿来划分给对象实例最后更新列表记录。堆内存不完整 有空间碎片较为复杂 那么如何判断 Java 堆中的内存是否完整呢这个是由采用的垃圾收集器决定 带有整理内存空间的能力的如 Serial、Par New 等内存会比较完整。基于清除算法的如 CMS内存会产生空间碎片。 3. 内存初始化 内存分配完成后虚拟机必须将分配到的内存空间都初始化为零值不包括对象头这步操作保证了对象的实例字段在 Java 代码中可以不赋初始值就直接使用使程序能访问到这些字段的数据类型所对应的零值。 4. 设置对象头 初始化零值完成之后虚拟机要对对象进行必要的设置例如对象是哪个类的实例、如何才能找到类的元数据信息、对象的哈希码、对象的 GC 分代年龄等信息这些信息存放在对象头中。 另外根据虚拟机当前运行状态的不同如是否启用偏向锁等对象头会有不同的设置方式具体描述见下方对象的存储布局。 5. 执行 init 方法 在上面工作都完成之后从虚拟机的视角来看一个新的对象已经产生了但从 Java 程序的视角来看对象创建才刚开始。Class 文件中的init方法还没有执行所有的字段都是默认的零值。 所以一般来说执行new 指令之后会接着执行init方法把对象按照程序员的意愿进行初始化这样一个真正可用的对象才算完全产生出来。 二、对象的存储布局 1. 简介 1.1 存储布局 如图在 HotSpot 虚拟机里对象在堆内存中的存储布局可以划分为三个部分 对象头header)实例数据instancedata)对齐填充padding) 1.2 数据结构 HotSpot 虚拟机使用名为oops(Ordinary Object Pointers) 的数据结构来表示对象。这些oops等同于本地 C 指针。 instanceOops 是一种特殊的oop表示 Java 中的对象实例。 下图表示对象的数据结构以及占用内存大小 1.3 使用 JOL 查看对象内存布局 JOL 是 OpenJDK 官网提供了查看对象内存布局的工具使用步骤如下。后续的打印的控制台信息都是通过该工具实现的。 导入依赖 dependencygroupIdorg.codehaus.plexus/groupIdartifactIdplexus-utils/artifactIdversion4.0.0/version /dependency使用 JOL 提供的方法 public static void main(String[] args) {//查看当前虚拟机信息System.out.println(VM.current().details());//查看对象内部信息System.out.println(ClassLayout.parseInstance(new Object()).toPrintable());//查看对象外部信息包括引用System.out.println(GraphLayout.parseInstance(new Object()).toPrintable());//查看对象占用总大小System.out.println(GraphLayout.parseInstance(new Object()).totalSize()); }1.4 一个空的 Object 占用多大内存 空 Object 是只有对象头没有实例数据也无需填充对齐。 如图所示HotSpot 64 位 虚拟机中 普通对象 占用 16 字节数组对象 占用 24 字节对象大小须为 8 字节整数倍 代码示例 public static void main(String[] args) {//使用 JOT 查看对象内存System.out.println(ClassLayout.parseInstance(new Object()).toPrintable());System.out.println(---------------------------);System.out.println(ClassLayout.parseInstance(new ArrayList()).toPrintable()); }2. 对象头 2.1 Mark Word Mark Word 用于存储对象自身的运行时数据如哈希码、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等。这部分数据的长度在32位和64位的虚拟机未开启压缩指针中分别为 4 个字节和 8 个字节。 对象头里的信息是与对象自身定义的数据无关的额外存储成本考虑到虚拟机的空间效率Mark Word 被设计成一个有着动态定义的数据结构。 它会根据对象的状态复用自己的存储空间也就是说在运行期间 MarkWord 里存储的数据会随着锁标志位的变化而变化如下图为 HotSpot 64 位的对象的存储内容。 2.2 Klass Pointer 类型指针即对象指向它的类型元数据的指针虚拟机通过这个指针来确定该对象是哪个类的实例。注意是 Klass 不是 ClassClass Pointer是类的指针而 Klass Pointer指的是底层 c 对应的类的指针。 大致流程是一个对象 new 出来以后是被放在堆里的类的元数据信息是放在方法区里的在 new 对象的头部有一个指针指向方法区中该类的元数据信息这个头部的指针就是 Klass Pointer。 并且并不是所有的虚拟机实现都必须在对象数据上保留类型指针换句话说就是查找对象的元数据信息并不一定要经过对象本身这点我会在下一节“如何找到对象”具体讨论。 HotSpot 64 位支持指针压缩功能根据是否开启指针压缩Class Pointer 占用的大小将会不同 未开启指针压缩时占用 8 byte (64bit)开启指针压缩情况下占用 4 byte (32bit) 2.3 Length 数组对象特有表示数组长度占用 4 字节32bit空间因为虚拟机可以通过普通对象的元数据信息确定对象的大小但是如果数组的长度是不确定的将无法通过元数据中的信息推断出数组的大小。 3. 实例数据 实例数据部分是对象真正存储的有效信息即我们在代码里面所定义的各种数据类型的字段无论是从父类继承下来的还是在子类中定义的字段都会记录起来。 3.1 基本数据类型 3.2 引用数据类型 开启指针压缩情况下占 8 字节开启指针压缩后占 4 字节。 4. 对齐填充 对象的第三部分是对齐填充这并不是必然存在的也没有特别的含义它仅仅起着占位符的作用。 由于 HotSpot 虚拟机的自动内存管理系统要求对象起始地址必须是 8 字节的整数倍换句话说就是任何对象的大小都必须是 8 字节的整数倍。 对象头部分被精心设计成正好是 8 字节的倍数因此如果对象实例数据部分没有对齐的话就需要通过对齐填充来补全。 如何关闭对齐填充 # VM参数# 开启 -XX:CompactFields # 关闭 -XX:-CompactFields如何设置对齐填充长度 #VM 参数 -XX:ObjectAlignmentInBytes16三、对象的指针压缩详解 1. 什么是指针压缩 指针压缩是对类型指针或普通对象指针进行压缩主要包含以下几种 压缩指针类型压缩目标压缩变化压缩类型指针Klass Pointer8 字节变为 4 字节压缩普通对象指针对象引用8 字节变为 4 字节数组对象8 字节变为 4 字节 注意堆内存设置不要超过 32 GB否则指针压缩会失效。 在 JDK 6 之后的版本中指针压缩是被默认开启的可通过启动参数开启或关闭该功能 # 开启压缩类型指针 -XX:UseCompressedClassPointers # 关闭压缩类型指针 -XX:-UseCompressedClassPointers # 开启压缩普通对象指针 -XX:UseCompressedOops # 关闭压缩普通对象指针 -XX:-UseCompressedOops 代码示例 public static void main(String[] args) {//使用 JOT 查看对象内存System.out.println(ClassLayout.parseInstance(new Object()).toPrintable()); }正常默认情况下指针压缩是开启的此时类型指针位 4 字节 2. JVM 内存不建议超过 32GB 一般系统内存的最小 IO 单位是字节byte按照8 bit 为一组也就是 1 字节byte分配一个地址。指针的 bit 和内存中的 bit 其实是有区别的。指针的 bit 对应着一个内存地址一个内存地址对应着 1 字节byte。 使用 4 字节32 bit指针可以表示 2 32 2^{32} 232个内存地址而每一个地址指向的是 1 字节8 bit故最大可表示 4GB 内存。 通过对象填充我们了解到 Java 对象默认使用了 8 字节对齐填充也就是我在使用这块内存时候最小的分配单元就是 8 字节。这样我们的指针指向的地址就是 8 字节而不是一般系统的 1 字节。 所以虚拟机在开启指针压缩的情况下Klass Pointer 最大可表示 32GB 内存超过则指针压缩失效故不建议堆内存设置超过 32GB。 那么如果业务场景内存超过32GB怎么办呢可以通过修改默认对齐长度进行再次扩展将对齐长度修改为 16 字节。 3. 指针压缩的原理 我们通过指针压缩将Klass Pointer 压缩到 4 自己这样有什么问题吗原来的指针大小为 8 字节64 bit可以表示 2 64 2^{64} 264个内存地址这样压缩完可以表示的不就少很多 其实没有。通过上面简介中的描述了解到 Java 对象默认使用了 8 字节对齐也就是 1 个对象占用的空间必须是 8 字节的整数倍。 这样就可以通过基址 偏移量来表示对象的真正地址基址其实就是对象地址的开始但是不一定是 Java 堆的开始地址。 那么这个真正地址怎么计算呢公式如下符号不了解可以看运算符这篇文章。 64 位地址 基址 压缩对象指针 对象对齐偏移 压缩对象指针 (64 位地址 - 基址) 对象对齐偏移 对象对齐偏移与对齐填充相关它的值就是对齐填充长度的指数值比如我们默认的对齐填充长度为 8 字节也就是 2 3 2^{3} 23则对象对齐偏移的值就是 3。偏移量就是压缩对象指针 3这就是为什么网上很多文章描述的去掉后三位。 这样虚拟机在定位一个对象时不需要使用真正的内存地址而是定位偏移量映射后的地址即可。 四、如何找到对象 创建对象自然是为了后续使用该对象Java 中是通过栈桢里的 reference 数据来指向堆上的具体对象。目前主流的访问方式主要有使用句柄和直接指针两种。 1. 通过句柄 如下图 Java 堆中将可能会划分出一块内存来作为句柄池reference 中存储的就是对象的句柄地址而句柄中包含了对象实例数据与类型数据各自具体的地址信息。 2. 通过直接指针 使用直接指针访问的话Java 堆中对象的内存布局就必须考虑如何放置访问类型数据的相关信息reference 中存储的直接就是对象地址如果只是访问对象本身的话就不需要多一次间接访问的开销。 使用直接指针来访问最大的好处就是速度更快它节省了一次指针定位的时间开销由于对象访问在Java中非常频繁因此这类开销积少成多也是一项极为可观的执行成本也是 HotSpot 使用的方式。 参考 [1] 周志明. 深入理解 Java 虚拟机第3版. [2]峰哥学Java. 对象的内存布局.
http://www.zqtcl.cn/news/625602/

相关文章:

  • 公司网站怎么做才高大上大数据营销的含义
  • 做网站点做关于什么的网站
  • 网站建设服务费税率多少汕头模板建站流程
  • 网站 建设实验小结做淘宝客优惠券网站还是APP赚钱
  • 付银行的网站建设费的会计科目网站建设前端
  • 做网站题材海南网站建设软件
  • 门户网站建设 考核从零开始学做网站cdsn
  • 百胜网站建设秀屿区建设局网站
  • 公司招聘做哪家网站建筑网站开发
  • 网站建设文案详情一条龙平台
  • 四站合一网站建设公司权威的手机网站制作
  • 自主网站建站上海金瑞建设集团网站
  • 阿里云网站建设方案书中山市公司企业网站的选择
  • 网站建设管理工作制度知名网站建设加盟合作
  • 网站定制公司推荐wordpress 插件 封面
  • 企业手机网站建设行情做外贸哪个网站比较好2017
  • 专业网站制作电话软件推广
  • 免费建站系统博客海外网站搭建
  • 网站建设与制作视频教学站酷网图片
  • 网站开发还有哪些万维网申请网站域名
  • 做网站费用上海判断网站做的好坏
  • 有了域名和空间怎么建网站哪些公司需要网页电商设计师
  • 网站开站备案深圳创业补贴10万
  • 圆通我做网站拉上海建站系统
  • 对于做网站有什么要求新闻发布会视频
  • 网站建设专业就业前景成都房产信息网 官网
  • 西宁网站建设公司排行网站查询域名ip解析
  • 柳州企业网站开发公司如何做网站首页图
  • 刷赞网站空间免费深圳网站制作公司排名
  • 网站内部优化策略获取网站的路径