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

免费3d模型素材网站专门做图片剪影的网站

免费3d模型素材网站,专门做图片剪影的网站,百度服务电话6988,建立个人网站的成本StringTable 特性 常量池中的字符串仅是符号#xff0c;第一次用到时才变为对象 利用串池的机制#xff0c;来避免重复创建字符串对象 字符串变量拼接的原理是 StringBuilder #xff08;1.8#xff09; 字符串常量拼接的原理是编译期优化 可以使用 intern 方法#…StringTable 特性 常量池中的字符串仅是符号第一次用到时才变为对象 利用串池的机制来避免重复创建字符串对象 字符串变量拼接的原理是 StringBuilder 1.8 字符串常量拼接的原理是编译期优化 可以使用 intern 方法主动将串池中还没有的字符串对象放入串池 1.8 将这个字符串对象尝试放入串池如果有则并不会放入如果没有则放入串池 会把串池中的对象返回1.6 将这个字符串对象尝试放入串池如果有则并不会放入如果没有会把此对象复制一份放入串池 会把串池中的对象返回 场景1 package com.vmware.jvm;public class Demo1 {public static void main(String[] args) {String aa;String bb;String cab;} }在JVM中会预先准备好一块内存空间 StringTable [] 其内容为空 数据结构采用HashTable此时符号a、b、ab都还是常量池中的符号还没有变为java字符串对象ldc #2会将a符号变为a字符串对象然后判断StringTable中是否存在字符串a,如果不存在则添加到StringTable中否则直接使用StringTable中的串ldc #3会将b符号变为b字符串对象 然后判断StringTable中是否存在字符串b,如果不存在则添加到StringTable中否则直接使用StringTable中的串ldc #4会将ab符号变为ab字符串对象 然后判断StringTable中是否存在字符串ab,如果不存在则添加到StringTable中否则直接使用StringTable中的串执行结束后: StringTable [“a”,“b”,“ab”] ❗️ 注意:字符串不会预先加载到StringTable中而是当使用该字符串时才会被加载其行为为懒惰型 反编译代码 stack1, locals4, args_size10: ldc #2 // String a 2: astore_1 3: ldc #3 // String b 5: astore_2 6: ldc #4 // String ab 8: astore_3 9: return场景2 public class Demo1 {public static void main(String[] args) {String a a;String b b;String c ab;String d a b;} }反编译如下 9: new #5 // class java/lang/StringBuilder //new StringBuilder() 12: dup 13: invokespecial #6 // Method java/lang/StringBuilder.init:()V 调用无参构造方法 16: aload_1 //从LocalVariableTable中加载1号槽的变量a 17: invokevirtual #7 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; //调用StringBuild().append(a) 20: aload_2 //从LocalVariableTable中加载2号槽的变量b 21: invokevirtual #7 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;//调用StringBuild().append(b) 24: invokevirtual #8 // Method java/lang/StringBuilder.toString:()Ljava/lang/String; //调用toString()方法 - new String(ab); 27: astore 4 //存储到LocalVariableTable4号槽StringBuild toString方法源码 Overridepublic String toString() {// Create a copy, dont share the arrayreturn new String(value, 0, count);}相当于 new StringBuild().append(a).append(b).toString();调用new String(“ab”)后相当于在堆中创建了一个新的字符串对象所以 dc //false d在堆中 c在StringTable中编译期优化 javac会认为e的结果是确定的所以进行了编译期优化 String e a b;反编译 29: ldc #4 // String ab相当于直接从常量池中加载符号ab ce //true c第一次被加载到StringTable中e与c相同不会再次进入StringTablee指向的地址与c的地址相同字符串延迟加载证明 可以使用IDEA开启debug模式后使用内存检测功能观察字符串的数量 package com.vmware.jvm;public class Demo2 {public static void main(String[] args) {System.out.println();//2433System.out.println(a);//2434System.out.println(b);//2235System.out.println(c);//2436System.out.println(a);//2436System.out.println(b);//2436System.out.println(c);//2436} }代码每执行一行String的数量1说明字符串没有进行预加载第二次使用字符串时String的数量没有增加 场景三 public class Demo3 {public static void main(String[] args) {String xab;String s new String(a) new String(b);//实际上利用StringBuild的append方法进行拼接a b会被先加载到串池中 StringTable[ab,a,b]String s2 s.intern();//入池失败 s2- table.ab s- heap.ab x- table.abSystem.out.println(s x);//falseSystem.out.println(s2 x);//true} }intern方法在jdk1.8 将这个字符串对象尝试放入串池如果有则并不会放入并返回串池中的对象在jdk1.6中将这个字符串对象尝试放入串池如果有则并不会放入如果没有会把此对象复制一份放入串池 会把串池中的对象返回 String s2 s.intern();//s2 - table s- heapintern方法注释:调用 intern 方法时如果池已包含与equals(Object)方法比较后相等的String字符串则返回池中的字符串。否则此String对象将添加到池中并返回对此String对象的引用 问题 package com.vmware.jvm;public class Demo4 {public static void main(String[] args) {String s1 a;String s2 b;String s3 a b;String s4 s1 s2;String s5 ab;String s6 s4.intern();//问System.out.println(s3 s4);//false s3在编译期进行优化 s3ab 在StringTable中 s4new StringBuild().append(a).append(b),toString() 在堆中System.out.println(s3 s5);//true s3进入StringTable s5发现StringTable中有ab则指向Table中的地址System.out.println(s3 s6);//true s4调用intern方法后入池失败返回池中的ab所以 s6即为池中的abString x2 new String(c) new String(d);String x1 cd;x2.intern();//将对象new String(cd)放入池中,入池失败//问 如果调换了后两行的位置呢如果是jdk1.6呢System.out.println(x1 x2);//jdk1.8 false x2指向堆x2调用入池方法后入池失败 x2指向堆 x1指向StringTable//交换位置 x2入池成功,x2指向池中的cd x1指向池中的c 所以为true//jdk1.6 首先在堆中new String(cd) 然后调用intern方法会对堆中的对象拷贝一份入池而x2仍然指向堆中的对象 x1发现池中有cd直接使用池中的对象所以为false} }String Table的位置 jdk1.6:永久代jdk1.7、1.8:堆内存 为什么要将StringTable从永久代移动到堆中? 因为永久代的内存只有当触发FullGC的时候才会回收而堆内存在触发MinorGC的时候就会触发回收由于StringTable使用比较频繁所以JVM工程师对位置进行了移动 垃圾回收 package com.vmware.jvm;/*** apiNote StringTable垃圾回收延时* -Xmx10m:设置堆大小为10m* -XX:PrintStringTableStatistics 打印StringTable信息* -XX:PrintGCDetails -verbose:gc 打印垃圾回收信息** 初始信息* StringTable statistics:* Number of buckets : 60013 480104 bytes, avg 8.000* Number of entries : 1711 41064 bytes, avg 24.000 //StirngTable中的key-value对 1711* Number of literals : 1711 154040 bytes, avg 90.029 //字符串数量1711* * 添加10000个字符串到StringTable后* StringTable statistics:* Number of buckets : 60013 480104 bytes, avg 8.000* Number of entries : 5845 140280 bytes, avg 24.000* Number of literals : 5845 353352 bytes, avg 60.454* 数量小于11711,说明StringTable内进行了垃圾回收*/ public class Demo6 {public static void main(String[] args) {int i 0;try {for (int j 0; j 10000; j) {String.valueOf(j).intern();}} catch (Throwable e) {e.printStackTrace();} finally {System.out.println(i);}} }性能调优 StringTable采用的数据结构为哈希表所以可以通过调整主数组的大小来减小哈希碰撞的概率进而提升效率 调整StringTable的桶大小 -XX:StringTableSize桶个数考虑将字符串对象是否入池 如果程序运行期间会产生大量字符串并且字符串重复数量较多可以考虑将字符串进行入池操作减少内存开销 入池前 入池后
http://www.hkea.cn/news/14511874/

相关文章:

  • 有域名了建立免费网站多商户商城系统源码
  • 建设网站宝安区内衣网站建设详细方案
  • 温州微网站公司求助用cms做网站设计_以我的家乡家乡为主题
  • 做ps兼职的网站建设部网站投诉核查企业名单
  • 美食网站建设服务策划书为何用wdcp建立网站连不上ftp
  • 网站建设和优化的步骤中国建设协会官网
  • 国外英语写作网站局域网里做网站
  • 建设部一建查询网站wordpress调用分类栏目
  • 剑灵网站模板网站栏目设计优化方案
  • 网站建设域名有哪些类型服装设计效果图
  • 龙岗网站制作市场没有网站如何做营销
  • 网站建设岗位主要做什么营销方式方案案例
  • 公司注册资金认缴和实缴的区别英文seo公司
  • 做服装设计有什么网站可以参考做网站都有跳转链接
  • 装潢公司网站建设营销的目的有哪些
  • 郑州网站建设创业网络架构图怎么画
  • 百度推广弄个网站头像要钱吗?大学哪个专业可以做网站
  • 网站建设的英语怎么说wordpress去除作者归档
  • 重庆网站建设letide一个完整的项目策划书
  • 找人做网站做的很烂云南工程建设信息网站
  • 抚州市建设局招标办网站建设网站的一般步骤
  • 济南智能网站建设咨询电话大数据平台建站
  • 游戏设计 网站学生个人网页制作html动态
  • php网站制作商品结算怎么做wordpress 瑜伽课程
  • 网站做服装那个平台好一点枣庄市建设局网站
  • 做网站最大可以做多少g做公司集团网站
  • 网站与域名的关系杭州市萧山区建设局网站
  • html门户网站教育机构网址
  • 网站系统修改不了怎么回事网站网络设计是怎么做的
  • 南阳seo网站价格最近的重要新闻