小魔女 发表于 2015-1-18 11:29:30

JAVA网页编程之Java String的序列化小结仓酷云

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


[*]字符串重用——节俭内存
由于字符串太多,假如可以重用则可以节俭很年夜的内存。起首看上面一个例子:
Stringstring1=“HELLOHELLO”;
Stringstring2=“HELLO”+“HELLO”;
下面创立了几个字符串?1or2?后者是静态创立的,不外信任JVM能够对其间接优化的,由于编译时已晓得内容了,推测是一个instance,即统一个char数组。Heapdump出来后察看公然是一个。
Stringstring3=args+args;
输出参数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;
inputStream.read(newbyte);
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));
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编程思想》这本书,找找一个自己写的代码跟书上的代码有什么不一样。

深爱那片海 发表于 2015-2-11 20:42:27

一直感觉JAVA很大,很杂,找不到学习方向,前两天在网上找到了这篇文章,感觉不错,给没有方向的我指了一个方向,先不管对不对,做下来再说。

爱飞 发表于 2015-3-2 18:21:45

那么我书也看了,程序也做了,别人问我的问题我都能解决了,是不是就成为高手了呢?当然没那么简单,这只是万里长征走完了第一步。不信?那你出去接一个项目,你知道怎么下手吗,你知道怎么设计吗,你知道怎么组织人员进行开发吗?你现在脑子里除了一些散乱的代码之外,可能再没有别的东西了吧!

蒙在股里 发表于 2015-3-8 01:35:59

不过,每次的执行编译后的字节码需要消耗一定的时间,这同时也在一定程度上降低了 Java 程序的运行效率。

第二个灵魂 发表于 2015-3-10 03:35:19

Pet Store.(宠物店)是SUN公司为了演示其J2EE编程规范而推出的开放源码的程序,应该很具有权威性,想学J2EE和EJB的朋友不要 错过了。

谁可相欹 发表于 2015-3-17 04:10:58

我大二,Java也只学了一年,觉得还是看thinking in java好,有能力的话看英文原版(中文版翻的不怎么好),还能提高英文文档阅读能力。

若相依 发表于 2015-3-17 04:10:58

Sun公司看见Oak在互联网上应用的前景,于是改造了Oak,于1995年5月以Java的名称正式发布。Java伴随着互联网的迅猛发展而发展,逐渐成为重要的网络编程语言。

柔情似水 发表于 2015-3-17 05:09:13

是一种使网页(Web Page)由静态(Static)转变为动态(Dynamic)的语言

精灵巫婆 发表于 2015-3-21 02:43:11

是一种语言,用以产生「小应用程序(Applet(s))

小妖女 发表于 2015-4-21 06:23:08

http://www.jdon.com/去下载,或到同济技术论坛的服务器ftp://nro.shtdu.edu.cn去下,安装上有什么问题,可以到论坛上去提问。

再现理想 发表于 2015-5-2 18:57:10

至于JDBC,就不用我多说了,你如果用java编过存取数据库的程序,就应该很熟悉。还有,如果你要用Java编发送电子邮件的程序,你就得看看Javamail 了。

莫相离 发表于 2015-5-4 00:50:25

吧,现在很流行的Structs就是它的一种实现方式,不过Structs用起来实在是很繁,我们只要学习其精髓即可,我们完全可以设计自己的MVC结构。然后你再研究一下软件Refactoring (重构)和极限XP编程,相信你又会上一个台阶。 做完这些,你不如整理一下你的Java代码,把那些经典的程序和常见的应用整理出来,再精心打造一番,提高其重用性和可扩展性。你再找几个志同道合的朋友成立一个工作室吧

仓酷云 发表于 2015-5-4 14:40:00

Java 编程语言的风格十分接近C、C++语言。

小魔女 发表于 2015-5-4 17:49:25

所以现在应用最广泛又最好学的就是J2EE了。 J2EE又包括许多组件,如Jsp,Servlet,JavaBean,EJB,JDBC,JavaMail等。要学习起来可不是一两天的事。那么又该如何学习J2EE呢?当然Java语法得先看一看的,I/O包,Util包,Lang包你都熟悉了吗?然后再从JSP学起。

分手快乐 发表于 2015-6-5 22:26:41

是一种使网页(Web Page)产生生动活泼画面的语言

飘灵儿 发表于 2015-7-7 18:47:37

象、泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发。

愤怒的大鸟 发表于 2015-9-30 12:59:08

Jive的资料在很多网站上都有,大家可以找来研究一下。相信你读完代码后,会有脱胎换骨的感觉。遗憾的是Jive从2.5以后就不再无条件的开放源代码,同时有licence限制。不过幸好还有中国一流的Java程序员关注它,外国人不开源了,中国人就不能开源吗?这里向大家推荐一个汉化的Jive版本—J道。Jive(J道版)是由中国Java界大名 鼎鼎的banq在Jive 2.1版本基础上改编而成, 全中文,增加了一些实用功能,如贴图,用户头像和用户资料查询等,而且有一个开发团队在不断升级。你可以访问banq的网站
页: [1]
查看完整版本: JAVA网页编程之Java String的序列化小结仓酷云