存档

2010年1月 的存档

java中String.split导致的内存泄露

2010年1月29日 闫鹏 4 条评论

有的时候,由于我们队Java api理解上面的错误,可能会导致出现一些意外的问题,比如内存泄露。认为虚拟机会为你创建一个新的对象,引用了不同的内存区域,结果却和想象中的不一样,导致服务宕机。

今天在查网关的内存溢出问题时,发现问题出现在String.split函数上面。大家都认为Java中的String是只读的,new新对象的时候一定是分配了新的内存,但虚拟机内部却不一定如此。sun的hotspot1.5版本在实现java的类时做了优化,为了减少内存拷贝,一个String对象可能会引用另外一个String对象的内存。查看jdk的源代码可知,String内部是用一个名为value的char数组存储内容的,但同时另外也有两个int类型的变量:offset与count。

查看String.split()函数的源代码,随后调用的是Pattern.split(),随后调用String.subSequence(),随后调用String.substring()。String的substring代码如下

public String substring(int beginIndex, int endIndex) {
if (beginIndex < 0) {
throw new StringIndexOutOfBoundsException(beginIndex);
}
if (endIndex > count) {
throw new StringIndexOutOfBoundsException(endIndex);
}
if (beginIndex > endIndex) {
throw new StringIndexOutOfBoundsException(endIndex - beginIndex);
}
return ((beginIndex == 0) && (endIndex == count)) ? this :
new String(offset + beginIndex, endIndex - beginIndex, value);
}

如果看到最后return的是new String,以为就是一个新的String就真的囧了,这不是一个向外开放的构造函数,它创建了一个新的对象,却是用的原来String对象中的内存

// Package private constructor which shares value array for speed.
String(int offset, int count, char value[]) {
this.value = value;
this.offset = offset;
this.count = count;
}

本来这样进行优化无可厚非,但在网关的应用情况下就出现问题了:
一次性查询得到一个String,里面记载了1000条数据结果,将这1000条数据结果拆分,封装成1000个对象,存在缓存里面。缓存是用LinkedHashMap,当Entry达到一定数量时就进行淘汰。这样就导致这1000个对象都淘汰了,才会释放存储了1000个数据的String,这个String可是相当的大啊。
又因为查询的时间段是有重叠的,导致每次查询的String都记载了很多重复的内容,虽然缓存里面只对String不同的地方保持了一次引用,但是却无意间存储了大量的无用数据。这就导致了jvm的内存溢出。

好多年没搞java了,结合以前上学时候查java内存泄露的一点经验,说明了:

1.出现内存泄露,通常都是有容器保持了大量的引用,查问题的时候,可以从容器优先开始

2.查看jdk的源代码,是很有必要的。

分类: 程序员 标签:

关于百度携手日本乐天

2010年1月28日 闫鹏 3 条评论

最近大家对百度携手日本乐天比较感兴趣,就连不在百度,不是电子商务领域的师兄都来问问情况。其实内部没有消息,至少对我这种基层人员来说就是没有消息,我也是从其他大网站的新闻上看到的。这真是中国特色,在国外看新闻,在国内看旧闻,囧。

要说对百度电子商务没有影响,肯定是不可能的,但要说有多大影响,我认为是正面与负面都是有限。

中国的B2C网站,虽然正处于蓬勃的发展期,但现在其实还没有多少能挣钱的,这与中国的大环境关系很密切:物流,b2c永远的痛。外包的物流不靠谱,前一阵不是还有DDS快递倒闭事件么,13年经营啊,还是被快递行业自身的无序恶性竞争压倒了,老板只能捐钱跑路。乐天进入了中国,又能在短时间内克服水土不服,实现盈利么?

所以说,乐天进入中国市场,短时间内影响力有限,长时间的影响力还有待观察,但对百度自身的电子商务事业来看:

1.对有啊平台影响不大,有啊平台将会更加专注于c2c的市场,呈现一个长尾格局。看来平台不像会对b2c做出倾向了。当然,从另外一个角度讲,这对与淘宝的竞争是有一定好处的,毕竟淘宝的流量目前多数都导给了出得起广告费的大商户,有啊平台发展起来,对大量的中小卖家是一个机会。

2.对百付宝应该是利好消息。由于中国的高级金融服务还没有发展起来,b2c商城要解决支付渠道,与第三方支付平台合作是一个必然的选择。虽然乐天多半会接入支付宝,但百付宝也应该会接,毕竟是百度自己的产品,要想形成产品群来对抗淘宝,自身的产品也要整合好。说不定到时候百付宝还排在支付宝前面呢。

话说回来,passport啥时候能支持openid,向外输出用户资源啊

linux的shell下文件批量改名

2010年1月27日 闫鹏 没有评论

以前写的一个小脚本,用在linux的shell批量修改大量文件名的情况下。昨天不小心删除了大量文件,找回的时候,又一次用到了它,在遇到大批量文件的时候,还是挺有效果的,共享一下。

用法:

1.将你要改名的文件都放在同一个文件夹下,运行”ls -l > oldnames”,然后“vi oldnames”,这时候看到的大概是这个样子:

total 1224
drwxrwxr-x   3 yanpeng yanpeng    4096 Sep 17 16:13 app
drwxrwxr-x   2 yanpeng yanpeng    4096 May 19  2009 bin
drwxrwxr-x   2 yanpeng yanpeng    8192 Jan 26 16:40 docpay

2.输入”ctrl+v”,移动光标,选中要删除的那一堆内容,其实就是文件名前面的那些列,输入“d”,得到的文件大概为

app
bin
docpay

3.删除掉第一行的空行,保存退出vi,然后”cp oldnames newnames”。

4.修改newnames文件中想要改名的文件为新文件名

5.将change_name.sh脚本放在你的那个放置文件的夹下,运行./change_name.sh就可以了(注意有执行权限,加执行权限的方法chmod a+x change_name.sh)

change_name.sh脚本内容,拷贝下,存好就能用了


#!/bin/sh

OLDNAMES='oldnames'
NEWNAMES='newnames'

fileline=`sed -n '$=' $OLDNAMES`
echo $fileline

index=1
while [ $index -le $fileline ]
do
oldname=`sed -n "${index}p" $OLDNAMES`
newname=`sed -n "${index}p" $NEWNAMES`
mv $oldname $newname
index=`expr $index + 1`
done
分类: 程序员, 软件 标签: ,

dreamhost上面无法使用memcached

2010年1月26日 闫鹏 1 条评论

昨天在dreamhost上面倒腾编译memcached,先编译了libevent才编好memcached,结果memcached需要libevent的库位于/usr/lib里面才行。没法启动(其实就算启动了也不一定行,ssh的那台机器根本就不是为网站提供服务的机器)。发邮件后,dreamhost的回复是这样的:

Unfortunately we don't support this on our shared hosting servers. If
you'd like to run this, you'll need to upgrade to a Private Server, which
you can do in your control panel here:
https://panel.dreamhost.com/?tree=vserver.provision
You would have to run this on a Private Server only, I'm sorry to say.
Please don't hesitate to write back if you need help with anything else.

看来dreamhost推销它的ps真实不遗余力啊,可是对比服务质量与价格,都没有linode好,要不是为了便宜,我为啥来你这里啊。

打算山寨个文件缓存,虽然通用性不强,但用在这里也够了。

分类: 生活, 程序员 标签:

惊世发明-连接电脑与现实生活

2010年1月23日 闫鹏 1 条评论

这个理念,对人机交互界面做了根本性的变革,机会好的话,将会引发下一代浪潮,再一次改变人们生活的吧。一旦投产,它没有理由不彻底的取代iphone。遗憾的是现有的电池技术貌似一直没有跟上移动设备的发展啊。

分类: 生活 标签:

推荐阅读:《浪潮之巅》

2010年1月23日 闫鹏 1 条评论

没注意是谁整理的文章,真的是很不错,推荐给大家看

=====================

近一百多年来,总有一些公司很幸运地、有意识或者无意识地站在技术革命的浪尖之上。一旦处在了那个位置,即使不做任何事,也可以随着波浪顺顺当当地向前漂个十年甚至更长的时间。在这十几年间,它们代表着科技的浪潮,直到下一波浪潮的来临。

从一百年前算起,AT&T 公司、IBM 公司、苹果公司 (Apple)、英特尔 (Intel) 公司、微软 (Microsoft) 公司、思科公司 (Cisco) 公司、雅虎 (Yahoo) 公司和谷歌 (Google) 公司都先后被幸运地推到了浪尖。虽然,它们来自不同的领域,中间有些已经衰落或者正在衰落,但是它们都极度辉煌过。它们都曾经是全球性的帝国,统治着自己所在的产业。

这些公司里面大大小小的人在外人看来都是时代的幸运儿。因为,虽然对于一个公司来讲,赶上一次浪潮不能保证它长盛不衰;但是,对于一个人来讲,一生赶上这样一次浪潮就足够了。对于一个弄潮的年轻人来讲,最幸运的莫过于赶上一波大潮。要预测未来是很难的,但是看看过去和现在,我们也许能悟出一些道理。我愿意借谷歌黑板报的空间,将我这些年来看到的和听到的人和事拿出来与大家分享。我会谈一谈我对每次浪潮的看法,对上述每个公司的看法,以及对其中关键人物的认识。在极度商业化的今天,科技的进步和商机是分不开的。因此,我也要提到间接影响到科技浪潮的风险投资公司,诸如 KPCB 和红杉风投 (Sequoia) 以及百年来为科技捧场的投资银行,例如高盛 (Goldman Sachs) 等等。

从dropbox下载|google文档

分类: 产品与商业, 生活 标签: