本站首页 返回顶部 关于博主

一个网络质量相关的无聊问题

      前不久,成都的同事给我演示了一个bug:点击“Upload License”按钮,会弹出Upload License对话框。奇怪的是,如果第二次打开Upload License对话框,从弹出对话框到整个对话框加载完毕,竟然要花费近20秒的时间。
      这是一个部署地为美国的Web应用,我们通过浏览器来访问网页。事实上,这个对话框很简单,基本上在1秒内就应该加载完毕,耗费这么长的时间,的确很意外。
       我尝试着重现这个bug,发现不能稳定地重现。大多数情况,对话框在1秒之内就能加载完毕。重现几率大约10%。据我所知,这个对话框仅需要加载html网页和Javascript代码,和后台之间不存在任何其他的交互。
       排除了与后台交互,等待response的时间过长的可能性之后,我怀疑问题的根源在于Web服务器。于是,尝试着把系统部署在本地的服务器上,发现加载速度相当快。因此,更加确认了我的想法:对方的Web服务器有问题。
       之后,转发给后台的同事进一步调查。同事反馈说,尝试了不下几十次,一直都无法重现。我通过自己的美国虚拟机来访问这个网页,的确,无论如何都重现不了。
       好吧,我只能得出结论,这很有可能是网络问题,排除公司网络防火墙的可能之后,只能是伟大的GFW了。

String.split()保存了原始的char数组

一个朋友发布了这样一条微博

蛋疼的String啊……虽然我之前注意到Java会利用String的不可变性在subString 的时候利用原Stirng的char数组和偏移量创建新的String,但是这还导致了split也一样是浅拷贝。如果想容一个超长的Stirng里 cut出一小部分,其实本体char数组都还在那个小部分里面留着,有撒方法能获取纯净的String吗……

出于好奇,我查看了一下String的代码,原来在String中用一个char[]数组来保存一段字符串,offset表示一个位移值,count表示字符串的长度。从char[]数组中的第offset开始,连续的count个字符就组成了这个字符串。比如说,如果char[]中存储的是"abcdefg",offset是1,count是3,那么这个字符串就是“bcd”。

对于一个原始字符串我debug了一下String的subString()和Split()两个函数,得知在通过这两个方法返回的String都保存了原始字符串中char数组,通过offset和count来得到最终的字符串。的确,和我想象的很不一样。

查看了一下subString()的代码,和String(orgString)这个拷贝函数,发现String(orgString)这个拷贝函数会返回一个“纯净”的String。于是,我回复:

我倒有个办法,不如调用new String(subString)在得到的subString上再创建一个string吧,这是一个深拷贝。如果嫌效率低,不如自己用 Arrays.copyOfRange()自己写一个subString()的方法。

最后,他给我发了一个链接:String.split() will keep original char array inside

嗯,也给出了两种方法:1.使用构造函数;2.自己实现。

让程序只能加载一次

很多时候,我们只允许某个程序加载一次。也就是说,不允许这个程序的两个进程同时运行。 要实现这个功能中,该怎么做呢?本文将讨论Java中是如何实现的。 我找到了如下几个备选方案。
 
1.在临时文件中标记程序的状态。
此方法提出者的观点是这样的:当程序运行时,在某个文件临时文件中写一个标记1;在程序退出时把这个标记改成0。在程序加载时,检查这个文件中的标记值 是什么,如果是0,则意味这系统中没有程序的运行实例。此时可以继运行。如果是1,那就意味着程序已经加载了一个实例,这时就可以直接退出了。 理论上似乎是可以的,但现实往往没那么完美。假设,当程序运行时,临时文件中的标记已经改为1了,这个时候程序异常退出,或者此时强行关掉Java虚拟机呢?程序显然会终止运行,但是临时文件中的标记却停留在了1,而不是期望中的0。当再次加载程序时,显然它会错误地认为已经有一个实例在运行了。 所以,这条路走不通。 阅读全文 »

The SWT FAQ中文(4)

英文原文:http://www.eclipse.org/swt/faq.php  版本:Version 1.0

The SWT FAQ

7.问: 怎样为我的平台编译Eclipse执行文件?
答:Eclipse是被二进制可执行文件加载。执行二进制文件后,它弹出进度画面,加载虚拟机。对于不同的窗口系统、操作系统和硬件构架,我们必须为之编译不同的二进制文件。要么从CVS代码库编译,要么从下载的eclipse SDK编译。 阅读全文 »

用AutoIt自动安装和卸载程序

  由于代码每天都会更新,编译组每天晚上会针对当天的代码编译出一个新的Build(除非编译不通过),而测试组第二天早上都会安装前一天晚上编译出的Build进行测试。
  一直以为测试组每天都手动地重复着这些枯燥无味的卸载、安装工作,直到同组的一个同事告诉我,测试组每天的卸载和安装工作都是通过脚本自动实现的,无需人为干预。 阅读全文 »