仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 4032|回复: 19
打印 上一主题 下一主题

[学习教程] JAVA网页编程之Java String的序列化小结仓酷云

[复制链接]
小魔女 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:29:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
你通过从书的数量和开发周期及运行速度来证明:net网页编程和ruby要比java简单。String对我们来讲太熟习了,由于它无处不在,更由于用String能够形貌这个天下几近一切的工具,乃至于为了形貌准确的数值都必要String出马(由于盘算机眼中的二进制和人类眼中的十进制间总有那末点隔阂)。由于熟习而变得复杂,也简单被疏忽。明天纪录一下关于String的简单被疏忽的两个成绩。


  • 字符串重用——节俭内存
由于字符串太多,假如可以重用则可以节俭很年夜的内存。起首看上面一个例子:
Stringstring1=“HELLOHELLO”;

Stringstring2=“HELLO”+“HELLO”;
下面创立了几个字符串?1or2?后者是静态创立的,不外信任JVM能够对其间接优化的,由于编译时已晓得内容了,推测是一个instance,即统一个char数组。Heapdump出来后察看公然是一个。
Stringstring3=args[0]+args[1];
输出参数HELLO HELLO? 字符串酿成几个?没错啊,是两个HELLOHELLO了。Dumpheap后察看,公然是两个了。(实在不必dumphealp,debug也能够看出来,string1和string3中的char[]指向地点是纷歧样的)。
依此延长,能够而知由java反序列化而来的那些string也是纷歧样的。实比方下;
publicfinalstaticvoidmain(String[]args)throwsException{

newStringDeserialized().testDescirialized();

}

publicvoidtestDescirialized()throwsException{

StringtestString=“HELLOHELLO”;

ObjectOutputStreamdataOutStream=newObjectOutputStream(newFileOutputStream(“./stringdeserialized.data”));

for(inti=0;i<1000;i++)

dataOutStream.writeObject(testString);

dataOutStream.close();

List<String>readAgainList=newArrayList<String>(100);

for(inti=0;i<100;i++){

ObjectInputStreamdataInputStream=newObjectInputStream(newFileInputStream(“./stringdeserialized.data”));

readAgainList.add((String)dataInputStream.readObject());

dataInputStream.close();

}

Thread.sleep(Integer.MAX_VALUE);

}


<br>
截图是heapdump出来的,有HELLOHELLO的个数有101个,占用的size>8080。关于JVM的内存利用可参考http://www.javamex.com/tutorials/memory/object_memory_usage.shtml
成绩来了,体系保护的数据年夜多是字符串信息,好比configserver,而良多的信息都是统一个字符串,那末重复的从收集序列化而来,占用多的Heap。固然本人能够写一个weakhashmap来保护,重用这些字符串。人人晓得JVM中有StringPool,利用它无疑最好不外。查找String源码,发明intern()的正文以下:
*Whentheinternmethodisinvoked,ifthepoolalreadycontainsa

*stringequaltothis<code>String</code>objectasdeterminedby

*the{@link#equals(Object)}method,thenthestringfromthepoolis

*returned.Otherwise,this<code>String</code>objectisaddedtothe

*poolandareferencetothis<code>String</code>objectisreturned.

因而改动下面一行代码为:
readAgainList.add(((String)dataInputStream.readObject()).intern());
再次Heapdump剖析以下,别的能够看出一个包括10个字符的String占用的Heap是80byte:

<br>


  • 字符串序列化的速率
今朝CS处置为了撑持所谓的恣意范例数据,CS接纳了一个技能,用Swizzle来保留java序列化后的byte范例,Server端无需反序列化就可以保留恣意范例的data;如许的害处有两个:通用的Java序列化效力不高;协定欠亨用,对其他言语撑持不可。由于今朝的数据信息基础都是String范例,而对对String数据的专门处置,能够经由过程String外部的byte数组(UTF-8)类暗示,如许也便于其他言语剖析。能够思索增添对publish(String)的撑持。因而做了以下测试来对照对String分歧serialize/deserialize的速度和巨细。
了局是writeUTF最小最快,关于100char的String,差异是数目级的相称分明,固然Swizzle利用了一个技能,当对统一个swizzleinstance屡次传输时,无需反复的序列化。
PS:Swizzle复杂的说就是把信息包装起来,然后把序列化的byte流缓存起来,如许假如一样的一个信息要推送/发送N次,就能干削减N-1次的序列化工夫。

publicclassCompareSerialization{

publicStringgenerateTestData(intstringLength){

Randomrandom=newRandom();

StringBuilderbuilder=newStringBuilder(stringLength);

for(intj=0;j<stringLength;j++){

builder.append((char)random.nextInt(127));

}

returnbuilder.toString();

}

publicinttestJavaDefault(Stringdata)throwsException{

ObjectOutputStreamoutputStream=null;

ObjectInputStreaminputStream=null;

try{

ByteArrayOutputStreambyteArray=newByteArrayOutputStream();

outputStream=newObjectOutputStream(byteArray);

outputStream.writeObject(data);

outputStream.flush();

inputStream=newObjectInputStream(newByteArrayInputStream(byteArray.toByteArray()));

inputStream.readObject();

returnbyteArray.size();

}

finally{

outputStream.close();

inputStream.close();

}

}

publicinttestJavaDefaultBytes(Stringdata)throwsException{

ObjectOutputStreamoutputStream=null;

ObjectInputStreaminputStream=null;

try{

ByteArrayOutputStreambyteArray=newByteArrayOutputStream();

outputStream=newObjectOutputStream(byteArray);

outputStream.writeBytes(data);

outputStream.flush();

inputStream=newObjectInputStream(newByteArrayInputStream(byteArray.toByteArray()));

byte[]bytes=newbyte[byteArray.size()];

inputStream.read(newbyte[byteArray.size()]);

newString(bytes);

returnbyteArray.size();

}

finally{

outputStream.close();

inputStream.close();

}

}

publicinttestSwizzle(Swizzledata)throwsException{

ObjectOutputStreamoutputStream=null;

ObjectInputStreaminputStream=null;

try{

ByteArrayOutputStreambyteArray=newByteArrayOutputStream();

outputStream=newObjectOutputStream(byteArray);

outputStream.writeObject(data);

outputStream.flush();

inputStream=newObjectInputStream(newByteArrayInputStream(byteArray.toByteArray()));

inputStream.readObject();

returnbyteArray.size();

}

finally{

outputStream.close();

inputStream.close();

}

}

publicinttestStringUTF(Stringdata)throwsException{

ObjectOutputStreamoutputStream=null;

ObjectInputStreaminputStream=null;

try{

ByteArrayOutputStreambyteArray=newByteArrayOutputStream();

outputStream=newObjectOutputStream(byteArray);

outputStream.writeUTF(data);

outputStream.flush();

inputStream=newObjectInputStream(newByteArrayInputStream(byteArray.toByteArray()));

inputStream.readUTF();

returnbyteArray.size();

}

finally{

outputStream.close();

inputStream.close();

}

}

publicfinalstaticvoidmain(String[]args)throwsException{

CompareSerializationcompare=newCompareSerialization();

Stringdata=compare.generateTestData(Integer.parseInt(args[0]));

Swizzleswizzle=newSwizzle(data);

System.out.println(“testJavaDefaultsizeonnetworking:”+compare.testJavaDefault(data));

System.out.println(“testJavaDefaultBytessizeonnetworking:”+compare.testJavaDefaultBytes(data));

System.out.println(“testStringUTFsizeonnetworking:”+compare.testStringUTF(data));

System.out.println(“testSwizzlesizeonnetworking:”+compare.testSwizzle(swizzle));

//warmup

for(inti=0;i<100;i++){

compare.testJavaDefault(data);

compare.testJavaDefaultBytes(data);

compare.testStringUTF(data);

compare.testSwizzle(swizzle);

}

longstartTime=System.currentTimeMillis();

for(inti=0;i<10000;i++){

compare.testJavaDefault(data);

}

longendTime=System.currentTimeMillis();

System.out.println(“testJavaDefaultusingtime:”+(endTime&ndash;startTime));

startTime=System.currentTimeMillis();

for(inti=0;i<10000;i++){

compare.testJavaDefaultBytes(data);

}

endTime=System.currentTimeMillis();

System.out.println(“testJavaDefaultBytesusingtime:”+(endTime&ndash;startTime));

startTime=System.currentTimeMillis();

for(inti=0;i<10000;i++){

compare.testStringUTF(data);

}

endTime=System.currentTimeMillis();

System.out.println(“testStringUTFusingtime:”+(endTime&ndash;startTime));

startTime=System.currentTimeMillis();

for(inti=0;i<10000;i++){

compare.testSwizzle(swizzle);

}

endTime=System.currentTimeMillis();

System.out.println(“testSwizzleusingtime:”+(endTime&ndash;startTime));

}

}


java比较简单,没有C++的烦琐,但学习时最好有C++为基础.与JSP和SQL起应用,功能强大.
灵魂腐蚀 该用户已被删除
沙发
发表于 2015-1-21 07:53:32 | 只看该作者
任职于太阳微系统的詹姆斯·高斯林等人于1990年代初开发Java语言的雏形,最初被命名为Oak,目标设置在家用电器等小型系统的程序语言
若天明 该用户已被删除
板凳
发表于 2015-1-30 12:31:43 | 只看该作者
你现在最缺的是实际的工作经验,而不是书本上那些凭空想出来的程序。
透明 该用户已被删除
地板
发表于 2015-2-6 11:45:55 | 只看该作者
《JAVA语言程序设计》或《JAVA从入门到精通》这两本书开始学,等你编程有感觉的时候也可以回看一下。《JAVA读书笔记》这本书,因为讲的代码很多,也很容易看懂,涉及到面也到位。是你学习技术巩固的好书,学完后就看看《JAVA编程思想》这本书,找找一个自己写的代码跟书上的代码有什么不一样。
深爱那片海 该用户已被删除
5#
发表于 2015-2-11 20:42:27 | 只看该作者
一直感觉JAVA很大,很杂,找不到学习方向,前两天在网上找到了这篇文章,感觉不错,给没有方向的我指了一个方向,先不管对不对,做下来再说。
爱飞 该用户已被删除
6#
发表于 2015-3-2 18:21:45 | 只看该作者
那么我书也看了,程序也做了,别人问我的问题我都能解决了,是不是就成为高手了呢?当然没那么简单,这只是万里长征走完了第一步。不信?那你出去接一个项目,你知道怎么下手吗,你知道怎么设计吗,你知道怎么组织人员进行开发吗?你现在脑子里除了一些散乱的代码之外,可能再没有别的东西了吧!
蒙在股里 该用户已被删除
7#
发表于 2015-3-8 01:35:59 | 只看该作者
不过,每次的执行编译后的字节码需要消耗一定的时间,这同时也在一定程度上降低了 Java 程序的运行效率。
第二个灵魂 该用户已被删除
8#
发表于 2015-3-10 03:35:19 | 只看该作者
Pet Store.(宠物店)是SUN公司为了演示其J2EE编程规范而推出的开放源码的程序,应该很具有权威性,想学J2EE和EJB的朋友不要 错过了。
谁可相欹 该用户已被删除
9#
发表于 2015-3-17 04:10:58 | 只看该作者
我大二,Java也只学了一年,觉得还是看thinking in java好,有能力的话看英文原版(中文版翻的不怎么好),还能提高英文文档阅读能力。
若相依 该用户已被删除
10#
发表于 2015-3-17 04:10:58 | 只看该作者
Sun公司看见Oak在互联网上应用的前景,于是改造了Oak,于1995年5月以Java的名称正式发布。Java伴随着互联网的迅猛发展而发展,逐渐成为重要的网络编程语言。
柔情似水 该用户已被删除
11#
发表于 2015-3-17 05:09:13 | 只看该作者
是一种使网页(Web Page)由静态(Static)转变为动态(Dynamic)的语言
精灵巫婆 该用户已被删除
12#
发表于 2015-3-21 02:43:11 | 只看该作者
是一种语言,用以产生「小应用程序(Applet(s))
小妖女 该用户已被删除
13#
发表于 2015-4-21 06:23:08 | 只看该作者
[url]http://www.jdon.com/[/url]去下载,或到同济技术论坛的服务器[url]ftp://nro.shtdu.edu.cn[/url]去下,安装上有什么问题,可以到论坛上去提问。
再现理想 该用户已被删除
14#
发表于 2015-5-2 18:57:10 | 只看该作者
至于JDBC,就不用我多说了,你如果用java编过存取数据库的程序,就应该很熟悉。还有,如果你要用Java编发送电子邮件的程序,你就得看看Javamail 了。
莫相离 该用户已被删除
15#
发表于 2015-5-4 00:50:25 | 只看该作者
吧,现在很流行的Structs就是它的一种实现方式,不过Structs用起来实在是很繁,我们只要学习其精髓即可,我们完全可以设计自己的MVC结构。然后你再研究一下软件Refactoring (重构)和极限XP编程,相信你又会上一个台阶。 做完这些,你不如整理一下你的Java代码,把那些经典的程序和常见的应用整理出来,再精心打造一番,提高其重用性和可扩展性。你再找几个志同道合的朋友成立一个工作室吧
16#
发表于 2015-5-4 14:40:00 | 只看该作者
Java 编程语言的风格十分接近C、C++语言。
小魔女 该用户已被删除
17#
 楼主| 发表于 2015-5-4 17:49:25 | 只看该作者
所以现在应用最广泛又最好学的就是J2EE了。 J2EE又包括许多组件,如Jsp,Servlet,JavaBean,EJB,JDBC,JavaMail等。要学习起来可不是一两天的事。那么又该如何学习J2EE呢?当然Java语法得先看一看的,I/O包,Util包,Lang包你都熟悉了吗?然后再从JSP学起。
分手快乐 该用户已被删除
18#
发表于 2015-6-5 22:26:41 | 只看该作者
是一种使网页(Web Page)产生生动活泼画面的语言
飘灵儿 该用户已被删除
19#
发表于 2015-7-7 18:47:37 | 只看该作者
象、泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发。
愤怒的大鸟 该用户已被删除
20#
发表于 2015-9-30 12:59:08 | 只看该作者
Jive的资料在很多网站上都有,大家可以找来研究一下。相信你读完代码后,会有脱胎换骨的感觉。遗憾的是Jive从2.5以后就不再无条件的开放源代码,同时有licence限制。不过幸好还有中国一流的Java程序员关注它,外国人不开源了,中国人就不能开源吗?这里向大家推荐一个汉化的Jive版本—J道。Jive(J道版)是由中国Java界大名 鼎鼎的banq在Jive 2.1版本基础上改编而成, 全中文,增加了一些实用功能,如贴图,用户头像和用户资料查询等,而且有一个开发团队在不断升级。你可以访问banq的网站
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-4-20 08:41

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表