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

怎样做农村电商网站商城系统平台开发

怎样做农村电商网站,商城系统平台开发,优化措施最新回应,成都抖音推广类常量池、运行时常量池和字符串常量池这三种常量池#xff0c;在Java中扮演着不同但又相互关联的角色。理解它们之间的关系#xff0c;有助于深入理解Java虚拟机#xff08;JVM#xff09;的内部工作机制#xff0c;尤其是在类加载、内存分配和字符串处理方面。 类常量池…类常量池、运行时常量池和字符串常量池这三种常量池在Java中扮演着不同但又相互关联的角色。理解它们之间的关系有助于深入理解Java虚拟机JVM的内部工作机制尤其是在类加载、内存分配和字符串处理方面。 类常量池Class Constant Pool 每个Java类文件.class文件都具有自己的类常量池它用于存储编译期生成的常量包括各种字面量字面量就是指由字母、数字等构成的字符串或者数值和符号引用比如类和接口的全名、字段的名称和描述符、方法的名称和描述符。类常量池在编译期间就已经被确定并被保存在.class文件中。 Class常量池是用来保存常量的一个中间场所。在JVM真的运行时需要把类常量池中的常量加载到内存中的运行时常量池中。 运行时常量池Runtime Constant Pool 运行时常量池是类被加载到JVM时类常量池的内存版本当Java类被加载到JVM时各个类文件中的类常量池内容被读取并存入到运行时常量池中其中字符串的部分直接进到字符串池其他常量进入到运行时常量池。 根据Java虚拟机规范约定每一个运行时常量池都在Java虚拟机的方法区中分配在加载类和接口到虚拟机后就创建对应的运行时常量池。 规范中规定了运行时常量池属于方法区但是没规定方法区属于哪。于是虚拟机在各自实现的时候就各显神通了。在不同版本的JDK中运行时常量池所处的位置也不一样。以HotSpot虚拟机为例 在JDK 1.7之前方法区位于永久代运行时常量池作为方法区的一部分处于永久代中字符串常量池位于运行时常量池的一部分也处于永久代中。 因为使用永久代实现方法区可能导致内存泄露问题所以从JDK1.7开始JVM尝试解决这一问题。 在JDK 1.7中静态变量和运行时常量池中的字符串常量池转移到了堆内存中其他类型的常量还保留在方法区中。 在JDK 1.8中彻底移除了永久代方法区通过元空间的方式实现元空间是使用本地内存(Native Memory)来存储类的元数据信息的。随之运行时常量池也在元空间中实现。 运行时常量池中包含了若干种不同的常量他的来源主要有两种 编译期可知的字面量和符号引用来自Class常量池 运行期解析后可获得的常量如String的intern方法 字符串常量池String Constant Pool 字符串常量池专门用于存储字符串常量。对于 Hotspot 虚拟机来说类加载时字符串字面量作为类常量池的一部分信息被载入运行时常量池中它们以特殊的形式存储在运行时常量池中此时它们并未被实例化为Java堆中的String对象。只有当这个字符串字面量被调用时才会对其进行解析即检查字符串常量池中是否已经存在相同内容的字符串对象。如果存在就直接返回指向该对象的引用如果不存在虚拟机会在字符串常量池中创建一个对应的String实例并返回这个新实例的引用。 这种处理方式的优势在于可以减少在类加载阶段对内存的需求和降低开销因为不是所有的字符串字面量在类的使用周期内都会被用到。同时此方法延迟了String对象的实例化直到它们真正被需要这有助于提高性能并减少内存的无谓占用。 为什么从JDK 1.7开始字符串常量池从永久代中挪到堆(Heap)中 主要原因是因为永久代的 GC 回收效率太低只有在FulIGC的时候才会被执行回收。但是Java中往往会有很多字符串的生命周期都很短暂将字符串常量池放到堆中能够更高效及时地回收字符串内存。 字符串常量池中的常量有以下几个来源: 1、字面量常量。 在代码中直接使用双引号括起来的字符串字面值(如 stringshello”)会被认为是常量并且会在编译后进入class文件的常量池并且在运行阶段进入字符串常量池。这是最常见的字符串常量来源。 2、intern()方法 String类提供了一个intern方法用于将字符串对象手动添加到字符串常量池中。调用intern()方法时如果字符串常量池中已经存在相同内容的字符串将会返回常量池中的引用;如果不存在则会在常量池中添加该字符串在堆中的引用。 以下有几个非常值得我们注意的地方 1字符串常量池是一个固定大小的Hashtable默认值大小长度是1009如果放进字符串常量池的String非常多就会造成Hash冲突严重从而导致链表会很长而链表长了后直接会造成的影响就是当调用String.intern时性能会大幅下降因为要一个一个找以此判断字符串常量在不在字符串常量池中。在jdk6中StringTable是固定的就是1009的长度所以如果常量池中的字符串过多就会导致效率下降很快。在jdk7中StringTable的长度可以通过一个参数指定 -XX:StringTableSize999912对于字符串的拼接纯字面量和字面量的拼接会把拼接结果作为常量保存到字符串池。如果在字符串拼接中有一个参数是非字面量而是一个变量的话整个拼接操作会被编译成StringBuilder.append这种情况编译器是无法知道其确定值的。只有在运行期才能确定。 比如这段代码 string s1 Hollis; string s2 Chuang; string s3 s1 s2; string s4 Hollis Chuang;在经过反编译后得到代码如下 String s1 Hollis; string s2 chuang ; string s3 (new stringBuilder() ).append(s1).append(s2).toString( ); String s4 Hollischuang;3jdk7版本在修改了常量池的基础上也对intern函数做了修改 在jdk7之前字符串常量池位于永久代中使用intern函数如果字符串常量池中没有该字符串对象会在字符串常量池中创建一个该对象但是在jdk7及之后字符串常量池移到了堆中使用intern函数如果字符串常量池中没有该字符串对象则不会在字符串常量池中创建对象而是保存堆中该对象的引用。 比如 String s new String(hello) new String(world); s.intern();在第一句代码中我们创建了一个引用变量s其指向堆中字符串对象helloworld而后调用intern函数此时字符串常量池中没有helloworld字符串对象如果是在jdk7之前jvm会在位于永久代的字符串常量池中创建一个helloworld字符串对象但是jdk7之后字符串常量池位于堆中不再需要重新创建字符对象而是在字符串常量池中保存堆中helloworld对象的引用。 关于intern函数可以学习这篇文章讲解非常通透深入解析String#intern
http://www.dnsts.com.cn/news/11359.html

相关文章:

  • 发帖效果好的网站怎样备份网站数据库
  • 保定网站建设设计鞍山网站制作一般需要多少钱
  • 优的网站建设深圳创业补贴
  • 无法创建wordpressseo店铺描述
  • 宜布网网站谁做的最新郑州发布
  • 电子商务网站搜索引擎设计电子商务是干什么的就业方向
  • 东莞网站网络推广seo sem是什么意思
  • 美工好的网站制作礼品袋图片
  • 临沂 网站推广网站开发原型法
  • 个人网站做团购dw网页制作教程div视频教程
  • 网站建设费用计入什么科目可以做mv的视频网站
  • 网站模板源码下载网深圳网站制作公司信息
  • 贷款网站开发网页美工设计的流程有哪些?
  • 瑞安市住房和城乡建设局网站沈阳设计公司排名
  • 网站制作网络推广价格合肥建设厅网站
  • 做网站站长开通vipwordpress user role editor
  • 青海建设网站价格低北京怎么建设网站
  • 全国建设管理信息网站云浮网站建设
  • 网站免费软件网站地图 设计
  • 做安装系统网站有钱赚吗iis默认网站启动不了
  • 直播视频网站外贸做网站推广
  • 电脑科技网站模板新手学网站建设解疑与技巧1200例
  • wordpress双语站建设厅培训中心网站
  • 网站外链建设的15个小技巧黑龙江新闻法治在线
  • 济南黄河路桥建设集团官方网站网站源码生成
  • 一元夺宝网站建设江西建设职业技术学院官方网站
  • 建站方案策划书刚做的网站在百度上搜不到
  • 怎么用手机做网站购物网站的详细设计
  • 网络优化2年工资有多少常州抖音seo
  • 网站开发毕业设计开题报告奉贤专业网站建设