作者:<span class="vcard">Liudroid</span>

【译者注】因为时间原因,这篇论文没有翻译完,感觉有点吃力。有些句子自己也没有太理解。如果有大牛理解文章中code-path和doorway的意思,请在评论里不吝赐教。

【译者注】
Batching是指,将多个日志合并成单个消息进行发送;Batching可以有效的降低消息粒度带来的额外损耗,提升吞吐。但是过大Batching容易造成单请求的延迟过大,导致并发请求数过高,继而影响了吞吐和请求延迟。

【翻译开始】

Roy Friedman 计算机科学系,以色列理工学院,海法,以色列
Erez Hadad 分布式计算系统组,IBM海法研究实验室,海法,以色列

【摘要】

本文针对镜像服务器提出了两种新颖的通用自适应消息合并方案。这两种方案都不用考虑底层通讯协议。这两种方案可以根据当前通讯负载实时自动调整消息合并级别。系统不需要明确的监控与校准。另外,本文还给出了详细的性能测试结果。

第一章 简介
大多数发送消息的开销都与消息的大小没有关系。举例来说,网络(或者中间件)协议栈的报文头,触发与执行系统调用的开销,在硬件级别争取使用网络的机会。

同样的,有一些可计算的处理消息的开销,无论是在物理层、网络层、传输层、会话层或是应用层。分开来算,他们每一层的开销都是极小的。可是一旦将它们合起来,他们的开销大到无法忽略。另外,即使这些开销造成的延迟产生的影响好像是是可接受的,但是当系统负载达到吞吐量最大值,这些影响对系统性能产生坏作用。举个具体的例子来说,处理单条消息的时间是1ms,那么系统每秒发送的消息不能超过1000条(单核条件下)。类似的,如果一个应用消息体50字节,消息头100字节,那么网络带宽至少有三分之二浪费在消息头上,而不是消息体上。将多条短消息合并为一条长消息会将每条消息的开销进行分摊,因此可以增加系统带宽。所以,这种技术现在在基于网络的应用中非常常见。

应用批消息合并的一个重要问题就是怎么决定什么时候将消息合并。要取得一定的权衡就要考虑:平衡相对于单条消息的带宽增益、获得一个良好的网络与CPU使用率。意思就是,为了增加带宽,我们希望合并尽量多的消息到一起。可是为了发送一个较大的消息,我们需要将第一条消息延迟相当长的时间。同样的,如果应用产生消息的速度比较慢,合并进程会一直等待足够的消息来进行合并,网络与CPU可能会空闲下来。

一些批消息合并模式比较通用,但是一般不考虑底层通讯协议和应用的特殊特征。另外一些比较专用,意味着他们什么时候合并消息的决定基于操作环境的特殊情况。很清楚地看到,通用模式的好处就是提供了更好的模块性和更松的耦合性,也就是说符合模块化设计原则。但是,正是由于这个原因,通用模式可能达不到专用模式的使用效果。

很大程度上来说,已有的通用批交易合并模式可分为两类:基于数量的和基于时间的。基于数量的模式,仅当应用消息的数量积累到一定数值(或者消息的大小达到一个限额)后,合并后的消息才被发送。再说基于时间的合并模式,合并后的消息周期性被发送,当前一批被发送后,打包合并所有积累的消息。

基于数量的合并模式问题在于当应用产生的消息量比较少的时候,这种模式并不能增加吞吐量。同时系统具有足够的CPU和网络带宽。更糟糕的是,因为消息产生的慢,合并延迟会变得非常高。事实上,如果应用产生的数据都小于合并的阈值,消息合并也不保证能完成。

基于时间的合并模式有类似的问题。如果合并超时时间设置的过高,消息延迟也会变大。同时如果通讯比较少,并不能充分利用系统吞吐量。从另外一个方面讲,如果将超时时间设置过短,每次仅有少量消息被合并。

当然,可以结合基于数量的模式与基于时间的模式,也就是说,无论是消息数量积累够了,还是到超时时间了,哪个条件先达到就发送已合并的消息。可是,这样依然无法完全解决上面讨论的问题。一种明显的补偿方式,引入一种能根据实际通讯模式进行动态自适应的合并参数。确实有一些文章提出了自适应合并。采用的方法是利用一个组件不停地监控系统的通讯状况,调整消息合并数量阈值和消息合并超时时间来应对探针的检测到的行为。

监控方式的解决方案存在一些问题:第一,监控行为本身增加了系统负载。第二,都是基于过去的情况调整合并参数,所以在通讯情况发生改变与合并线程做出反应之间存在一定延迟。如果通讯状况频繁发生改变,这种问题会更突出。因为基于监控的解决方案总是在实际的通讯状况之前落后一段时间。

在本文中我们提出了两种新颖的通用的自适应合并原理,别名***adaptive batching***(AB)和***timed adaptive batching***(TAB),他们能自动并且及时对通讯模式进行调整合并级别,不需要任何监控程序。这些模式是通用的,在于他们并不关心任何底层通讯协议,也不关心应用产生消息的速度。但是,两种模式针对复制服务器(或类似的分布式应用),也就是一个服务器必须广播每一个消息给所有其他的服务器。此外,对于AB模型来说,我们也假设重复的请求是由多个并发线程产生的(但是TAB模型不需要)。

我们还给出了两种模式下的详细性能测试,并且和基于数量的合并模式、基于时间的合并模式惊醒了对比。测试与对比是在FTS环境下进行了,FTS是我们开发一歌复制服务解决方案。

第二章 自适应合并
我们的自适应合并解决方案面向复制服务器及类似的分布式应用。通常我们假设有一些请求消息需要广播的模型。每一个请求都由一个单独的线程发起。每一个这样的线程先执行一些其他代码,比如创建或者准备发起求求,接下来调用cast()方法,也就是将当前请求加到当前合并消息中的原语。跟着合并进程细节后面,一个合并并发送的事件被不时地触发,触发发送并且重置当前批消息的动作。正如我们稍后介绍的,对多线程应用的假设只是适用于AB模型,不适用于TAB模型,TAB模型是真正的通用模型。

2.1 简单的自适应合并
正如图1表示的那样,AB程序是这么运行的:每一个线程在调用cast()函数前都执行一段公共代码。这段代码路径的一部分终止于cast()数,我们叫他doorway。在doorway的开始部分entry code用来注册一个在doorway内部执行的线程,例如,增加doorway的计数器。类似的,exit code用来注销执行的线程,比如减少doorway计数器。AB模型这样使用doorway:将doorway entry code植入cast()调用之前的一些位置。cast()函数本身作为exit code。如果一个线程正在执行cast,在注销自身并且将自己的请求加到合并消息之后,如果发现没有其他线程也在doorway中,那么这个线程就会触发一个发送事件。

AB模型的直观感受是,仅当多个请求满足cast原语的“紧挨着”特征,他们才应该被包含在同一个批消息中。意思就是这些线程在调用cast的时候,他们的请求时间挨的非常近。doorway就像一个天然的近距离传感器:一个线程穿过doorway的时间要求就是一个超时阈值。一段时间之内没有其他线程进入doorway,这一批消息就被打包并发送。因为可以说接下来的线程所发送的消息离加入当前这一批的消息中还太远。doorway的长度可用来控制程序的敏感度:长doorway比短doorway产生更长的消息,在低客户端负载的时候。因为这样就变得另外一个线程尽量在当前线程退出doorway前进入doorway。注意,自适应算法的本质可支持任何的doorway长度,正如后面我们会阐述的。

2.2 TAB模型
AB模型有一些缺点。第一,这种模式不能找到一种通用的代码路径作为doorway。一种足够长的通用代码路径不如部署多种具有同样entry/exit,不同code-lenth的程序。另外,AB模型需求仔细的代码分析和代码修正,来确定各种线程确实经过了entry/exit code。第二,AB doorway的长度以粗糙的指令粒度进行计算,导致很难精确地计算长度,因为它既是代码也是平台相关的。第三,doorway的长度受code-path长度的制约。最后,实现AB模型需要多线程处理模式,因为doorway需要探测独立执行的上下文的增长。

以上问题都被另外一种叫做TAB的模型解决了。TAB和AB最关键的不同点在于TAB使用了一个定时器而不是code-path作为doorway.这个定时器在一个线程想要调用cast的时候进行重置(再次说明应用级别的cast方法仅仅是线程想要广播消息的一个指示,并不是真正发送消息)。如果定时器超时了,这一批合并的消息就会被真正的发送出去(这种方式和AB中一个线程离开了doorway并且没有其他线程在doorway中的方式类似)。

有趣的是,AB模型允许当前批最后一个线程到来并且没有任何其他线程在doorway中时立即发送当前批消息。在TAB模型中,从另一个方面来看,最后一个线程之后计时器还有等待一段时间,从而迫使一个最小的非零额外延迟,即使一个批消息中只有一个消息。但是,TAB计时器允许定义一个实现无关的doorway长度。最后,不像AB模型,基于计时器的实现也能用来单线程基于事件的情形。

请注意TAB模式也明显的不同于基于超时的模式,即使他们都用计时器出发一个发送消息的动作。基于超时的模式发送消息的频率是固定的,无论消息产生的速率。这样能保证消息发送的进度但是同样会引入前面所说的程序僵化的问题。TAB的定时器,根据doorway的时长参数,只有当后面的消息离得足够远时候,才将前面的消息进行打包发送。这样,TAB适配消息发生速度与合并发送速度,但是也仅仅提供一定概率的进度保证,正如第六章阐述的那样。

 

 

我的翻译 技术杂谈

星座分析上说:“白羊座男人容易冲动消费,花钱经常发生在气血冲动之下,在一时痛快后才后悔不已,热爱运动的他们也喜欢把钱花在体育活动上。”

我对星座不太了解,我也不认为以上分析对所有白羊男都适用,但是对我,再适用不过了。作为一个白羊座IT男,我觉得自己的消费观就是没有消费观,如果被某种商品种草了,而且有钱买,十有八九这个东西要收入囊中。尤其喜欢买电子产品与体育用品。当时一定要买的东西,买回来之后用不了多久就束之高阁了。回头想一想自己的案例,算一算花的钱,真是一笔不小的数目。

这种消费情况下的一个结果就是,每当计算自己的存款的时候,特别轻松,因为几乎没有。当我发现这个问题以后,我觉得不能再这样下去了,我觉得我可能需要理财,理财没准能让我摆脱这种困境。我就想着买本书看吧,于是乎买了两本书,一本是曼昆的《经济学原理》,一本叫《一本书读懂投资理财学》。

第一本书没有逃脱我的消费魔咒。第二本书倒是看了,没什么收获,概念比较多,实际操作性不强。我发现我好像一直存在两个问题:一个是购买前强烈的购买欲望让我失去了理智。一个是没有耐心用,很快失去兴趣。这时候我才知道我应该看什么类型的理财书:
1、这本书要足够的薄,以便在我失去耐心前,可以看完。
2、这本书内容要足够生动有趣,否则看完了也容易忘。
3、内容要有可操作性,真正让人入门。

看起来这样的书,应该是给小朋友看的,可是小朋友需要理财吗?带着疑问到互联网上搜了一下,基本上都推荐了这本书《小狗钱钱》。

看书的过程非常流畅,因为整本书其实是在讲故事, 就是讲一个小女孩、一只会说话的小狗与其他人的故事。故事引人入胜,所有的道理都不是作者在说教,而是出自故事中各种各样的人物之口,这些人都非常有趣,当然,还会出自一只会说话的小狗之口。

这本书的内容有如何量入为出,如何理性消费。阐释了金钱与幸福的关系。还有如何分配我们挣得钱。讲到了银行、股票与基金。也涉及通货膨胀与复利。这只是有关理财方面的内容,更重要的是还有很多人生经验。
比如:集中精力做一件事。
在遇到困难的时候,仍然要坚持自己的想法。
当你决定做一件事的时候,你必须在72小时之内完成,否则你很可能永远不会再做了。

令我最印象深刻的还是关于这句话:你干的活最多只值报酬的一半,另一半报酬源于你的想法和实施这个想法的勇气。这句话说的不是为别人工作,而是创业,说明了为什么创业者、老板应该挣得钱比员工多的多。

我推荐这本书给小朋友们及其家长们,因为故事有趣,内容丰富。我们中国的家长对孩子的很多教育做的都非常好,比如教孩子有礼貌、有素养、有自信或者某些文体项目做的很好。可是很少听谁说教自己的孩子理财的,这很大程度上与国内社会大环境有关。通过让孩子读《小狗钱钱》,对这些天使来说,又打开了一个有趣而真实的新世界。

我推荐这本书给像我这样迷茫不知所错的理财小白,想要入门却不知道门在哪里。这本书不一定能让我们马上富有,也不一定能马上让我们有大的改变。但是能让我们时常想起这些故事,潜移默化之中改变我们的思维,影响我们的行动。这本书的作者,来自德国的博多·费舍尔,收到了成千上万读者的感谢信,令他感到意外的是,这些信是成年人写的。他认识到,一个动人的故事远比一幅美丽的图画更容易触动心灵,无论是对孩子还是成年人。

最后借用作者的一句话总结:我的这本书既是为孩子们写的,也是为成年人写的。

生活随笔

最近,银行的系统开发人员异常忙碌,经常加班,周末也不休息,为了实现央妈2016年9月30日发的一个监管通知:《中国人民银行关于加强支付结算管理防范电信网络新型违法犯罪有关事项的通知》,官方传送门

这个通知是和我们每个公民都息息相关的,会影响我们在银行、第三方支付机构进行转账、支付等操作。

我觉得大家还是去了解一下,毕竟是和自己有关的,别到了网点去办理业务,被说懵了。搜狐有一个《一张图读懂中国人民银行银发〔2016〕261号文》。

这张配图有一行话是这么说的:必将载入史册的银发〔2016〕261号文件。

能不能载入史册我不知道,如果载入史册,可能并不是因为他是第一个针对电信诈骗的政策性通知,而是因为他是一个大杀器。什么的大杀器?

反腐!

回过头来,就在2016年9月23日,最高法、最高检、公安部、工信部、人行、银监会联合发布公告:《关于防范和打击电信网络诈骗犯罪的通告》,官方传送门。2016年,大家可能有所了解,有几起电信诈骗案件导致人民生命财产遭受重大损失。而且电信诈骗案件呈多发态势,往集团化作案,职业化行骗发展。骗子真的成立了骗子公司!已经到了如此严重的地步,今年其实不止这两个文件,发布了很多类似的关于电信诈骗的通知、公告。最后,落实到银行业头上的就是人行261号文。

人行261号文其中的一个规定是,每个人,在一家银行,只能拥有一个I类账户。不精确的说一下,只能拥有一张借记卡。这个卡转账、理财啥的什么功能都有,就跟你手里现在有的借记卡一样。

再配合人证合一,二代身份证核验等规定。大大增加了电信诈骗大量开卡,转移资金的难度。

同时,这个规定对另一个社会方面也肯定会产生重大的影响,就是刚才我说的,反腐。

如果每个领导干部只有一个I类账户,这个账户的资金往来一目了然。同时,每个公民也只有一个I类账户,我们不能拿着别人的身份证去随便开卡了,因为只能开一个,已经开过了,就不能再开了。这样,领导干部的亲戚、朋友的账户数量就做了严格限制。

人行261号文有3个附件,其中一个附件《涉电信诈骗犯罪可疑特征报送指引》中提到的《可疑交易类型和识别点对照表》就对腐败洗钱的特点有详细的描述。

而人行261号文,让反腐在银行账户层面的检查,变得异常简单。腐败和腐败洗钱变的更加困难。

生活随笔

25岁之前,我一直以为我喜欢各种运动,包括羽毛球、乒乓球、篮球、台球等。我确实有时候想玩,不过是上学无聊了,同学们一起说去玩,我也跟着去凑热闹。比如高中的时候我踢过足球,因为好哥们喜欢踢足球,跟着他们玩,但是不知道过人和进球是什么感觉。高中开放了乒乓球室后,打了一段时间乒乓球。上大学的时候,也打过一段时间乒乓球,参加两次比赛,从来没赢过。打过几次篮球,板凳球员型。读研的时候,改为篮球和游泳交替玩了。

那时候感觉这些运动很好玩,那种好玩,是偶尔莫名其妙进了一个球,或者发生了什么好玩的事了,大家哈哈一乐,觉得很有意思。另外,也能找到志同道合的同学一起,不至于形单影只。还有一个,可以出一身臭汗,回去洗个澡,很舒服。(我开始想我以前可爱的同学们了)

上班之后,公司有各种各样的俱乐部,都是员工业余时间组织起来的,俱乐部的人大多是因为喜欢同一种活动。比如摄影俱乐部,读书俱乐部等,当然少不了运动系的羽毛球俱乐部、网球俱乐部等。我师傅特别喜欢羽毛球运动,而且是部门的高手。又加上我没有个运动爱好浑身难受,就入了羽毛球的“坑”了。这一入坑不要紧,就再也爬不上来了,从现在看,痴迷程度也和我师傅不相上下了。

说时候,我以前还打过羽毛球,比起一点都不会打的,我打的还可以。当时大家问我会玩啥,我还大言不惭的说羽毛球、乒乓球、篮球都会玩。就信心满满的去了球场,去了两次单位的球场之后我发现一个残酷的现实,我属于打球的里面最不会打的。打双打跟谁搭档谁输,之前的豪言犹在耳边,啪啪啪的打脸啊,谁让我说我会玩呢。打了这么长时间球,悟出一个道理,不要轻易说你会XXX,如果你说XXX都找不到能玩过我的,基本要被打脸的节奏。多的不说了,惨痛的教训在前面。

但是我觉得这个运动还不错,认识了不少部门的同事,还能锻炼一下身体。就是每次拖后腿,被碾压,不赢球搞的我很不爽。为了以后能更爽的啪啪啪打球,我就寻求志同道合的同志去找教练、报班学球。还真有一些同志,也是被虐的比较惨的。就一起报了个班,工作日晚上学球,7点到10点,三个小时。那个强度,我这个胖子学下来真的是用尽洪荒之力。大班教学,分两种教学模式,一种叫初级班,主要教动作要领,教练喂球,几个人轮流学。一种是比较稳定后,两个人多球联系,比如一个吊球,一个挑球。我们报的班是12次课的,每次3小时,其他同事学了几期,升级到中级班了,我还在初级班。于是,我是唯一在初级班呆满12次课的那个人。

当时挺惭愧,现在很庆幸。初级班虽然效率低(大家轮流上去打),但是还是比两人多球,教练指导的多一些。可以说,基础打得越好,后面上升越快。其实12次课之后,我的水平并没有什么提高,但是有很多动作我知道标准动作是怎么样了,我知道应该打出什么样的效果了。另外一个最重要的,知道步伐该怎么跑。这是重中之重。羽毛球运动七分步法,三分手法的说法一点不虚。此后经过不断的跟其他人打球、打过几次比赛、找私教练过几次,水平不断提高。这正是学球的重点,并不是一定学完区区12次课,水平有多大提高,水平的提高需要不断的刻意练习来固定动作,需要通过和球友不断的打来降低失误率,通过比赛来提高心理素质等。到写这篇文章的时候,在单位羽毛球俱乐部和高手都认识了,遇到高手也能多打几个回合了。再有人问羽毛球打的怎么样,我可以说:还可以,有空一起玩玩啊。

花钱学球,非常值。除非你有很强的兴趣自学,外加一面大镜子。为什么说很值呢,一是水平可以大幅提高且没有上限。二是可有效防止伤病。三是打起来动作帅气优美。为什么自学需要大镜子,因为你不知道自己动作是否标准。你得比照镜子里的自己和教学视频里是否一样帅。

羽毛球真是“贵族”运动啊,相对于学球交的钱,平时打球的钱才是大头好么。不会打的时候,找个空地你来我往的打。随着水平的提高,费用越来越贵。以最便宜的球馆算一下,45一小时,怎么都得打2个小时,90块钱。一桶球至少65吧,4个人打2小时,用半桶。算下来120块钱一次,分摊到每个人,就是30块钱每次。我现在平均每周两次,每周60,一年打45周是有了。纯打球费用2700。这还没算来回打车费用。打的还可以的,怎么都得置办一个好拍子,一个双好鞋吧。

现在是很喜欢打羽毛球了,一周不打浑身难受,平均一周都得打两次。要是什么事耽误了打球,也要补回来。并且现在主动邀请其他人打球。除了单位的俱乐部,还参加了两个社会上的俱乐部,有一个水平特别高的,我在里面女生都能带着我打。。基本上羽毛球大型赛事都会观看,也看一些教学视频。我感觉现在喜欢打羽毛球和小的时候打过羽毛球是有关系的,我五六岁的时候,就在老家的大院子里,我奶奶和我打羽毛球,那时候的球拍还是木头的,遇水就变形。就打过来打过去的,并不是打一两次就算了,断断续续时间不短,印象特别深刻。另外,我可以身体体会到,身体状况在这两年满满好转(除了发福的肚子)。

你需要学习某个东西,如果花钱能让你快速入门或者快速深入,那么就是值得的。钱这东西是好东西,特别是花出去能换回时间、心情、健康、家庭和谐的时候。

生活随笔

我听过你的歌

发行时间:1994年

作词:王焱

作曲:王焱

演唱:王焱/何影

王焱想唱这首歌,但是当时找不到女歌手对唱,何影是王焱当时从歌迷会里找的自己的歌迷。

 

(女)我听过你的歌我的大哥哥

(女)我明白你的心你的喜怒哀乐

(男)我是否可以问问问你的姓名

(男)因为你是我的知音

(男)我又多一个朋友

(女)我并不在乎你记住我的姓名

(女)我只想听到你的新歌你的声音

(男)我衷心谢谢你的厚爱你的真情

(男)我会把这一个瞬间用音乐来送给你

(女)愿你的声音永远伴我的左右

(男)我一定尽力

(男)用最美好的旋律伴你的左右

(女)呜…

(男)伴你左右

(女)伴我左右

(女)我听过你的歌我的大哥哥

(女)我祝你万事如意嗯天天快乐

(男)我衷心谢谢你的厚爱你的真情

(男)我会把这一个瞬间用音乐来送给你

(女)我听过你的歌我的大哥哥

(女)我明白你的心你的喜怒哀乐

(男)我是否可以问问问你的姓名

(男)因为你是我的知音

(男)我又多一个朋友

(女)我并不在乎你记住我的姓名

(女)我只想听到你的新歌你的声音

(男)我衷心谢谢你的厚爱你的真情

(男)我会把这一个瞬间用音乐来送给你

(女)愿你的声音永远伴我的左右

(男)我一定尽力

(男)用最美好的旋律伴你的左右

(女)呜…

(男)伴你左右

(女)伴我左右

(女)我听过你的歌我的大哥哥

(女)我祝你万事如意嗯天天快乐

(男)我衷心谢谢你的厚爱你的真情

(男)我会把这一个瞬间用音乐来送给你

(男)呀 我衷心谢谢你的厚爱你的真情

(男)我会把这一个瞬间用音乐

(男)用音乐来送给你

娱乐 生活随笔

现象:

本地开发环境Eclipse测试导出某张表的数据到Excel,报堆溢出:java.lang.OutOfMemoryError: Java heap space。但是测试环境或者开发环境启动Tomcat的时候配置-Xmx参数后就不报错。

分析流程:

先加入-Xmx参数调大堆内存到1G,测试不报错。用jdk\bin\jvisualvm查看内存情况,发现导出此表需要占用200M以上堆内存空间。

怀疑是默认堆最大内存,也就是不加-Xmx参数时可分配的最大堆内存不足,google一番,没有任何结果,包括官方文档,没有找到关于-Xmx参数默认值的说明。StackOverflow也木有啊。到SegmentFault去问了一下,无非是启动的时候打印看一下。

网上普遍介绍一个参数,-XX:+PrintFlagsFinal可以查看启动JVM时的配置值。加入此参数,报Unrecognized VM option ‘+PrintFlagsFinal’,eclipse中或者CMD中运行都会报这个错误,不支持的参数。再经过一番谷歌,有人指出这个参数是1.6.0.21之后才有的。我看了一下IDE自带的JRE是1.6.0.16。

我本机是安装了1.6.0.43的,将本地安装的jdk加入到eclipse已安装JRE中。用43版本的jre启动tomcat,加入-XX:+PrintFlagsFinal参数,发现最大堆内存是2G左右(本机8G内存),导出也没有内存溢出,瞬间懵逼。

不能用PrintFlagsFinal看最大内存,怎么办。用javaagent参数,写个JavaAgent程序,在启动tomcat之前执行。具体方法一搜一大堆。

public class MemoryAgent {
public static void premain(String agentOps, Instrumentation inst) {
System.out.println(“=========== MemoryAgent ===========”);
Long max = Runtime.getRuntime().maxMemory();
Long total = Runtime.getRuntime().totalMemory();
Long free = Runtime.getRuntime().freeMemory();
System.out.println(“=========== MAX :”+max);
System.out.println(“=========== TOTAL:”+total);
System.out.println(“=========== FREE :”+free);
}
}

果然最大堆内存是64M。

另外还有一个方法,jvisualvm也可以看到最大堆内存的值。

总结:

1.6.0.16在没有配置-Xmx标签的时候,默认最大堆内存是64M.

1.6.0.43在没有配置-Xmx标签的时候,默认最大堆内存是物理内存的1/4.

解决办法:

1、启动参数加入-Xmx并配置较大的值

2、升级JDK到1.6最大小版本或者更高大版本

3、启动参数加入-server。但是此参数会增加应用启动时间,但是会提高运行时效率,建议开发环境启用。

 

Java

我是不看球的,纯来瞎扯。

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

先说我的观点,我感觉给中国足球带来了一点希望。各位说我这不是废话吗,国家队每次换主帅大家不都是抱着一点希望。

我说的更直白点吧,在这个宇宙中,国足再也找不出比里皮更合适的主教练了。(其实我根本不认识几个足球教练)

1、外来的和尚会念经。

二十多年前开始,国足就请了不少外国籍比较有名气的教练。无论是当时,还是现在,不得不承认我们是足球弱国,选主帅得看水平、战绩、球队吧,国内主帅比较难挑。再看看里皮执教过的球队,作为一个不看足球的程序员,我都知道亚特兰大,那不勒斯,更遑论尤文图斯,国际米兰,意大利国家队了。当然,还有中国特色的广州恒大队。国内有哪个教练有如此丰富的指教经验。

执教经验是一回事,另外一点,国内主帅太好“管理”了。大家都是中国人,亲戚、老乡、同学、领导关系一大堆。各种人跟国内主帅不如跟歪果仁来的客气。我一个歪果仁,特别是颇有名气,战绩辉煌,受世界足坛尊敬的歪果仁,发点脾气、提要求那是严厉的风范。要是国内主帅发脾气,提各种要求,肯定有很多人看不惯、受不了。很多球迷都受不了,毕竟有些球迷们爱喊:下课,傻X。有操碎了心的球迷,有只求喊得爽的球迷,毕竟球馆是荷尔蒙释放的集中地,还有一个地儿是网络。

2、里皮在中国的这几年,不是白待的。

外来的和尚会念别的经,能不能念好中国经?我希望里皮在中国的这几年,不是白待的。藉由广州恒大,打开了解中国、了解中国足球、了解中国球员的大门。我相信里皮执教中国队既不是里皮的突然决定,也不是中国足协的突然决定。作为一个68岁依然精神抖擞,指点江山的世界名帅来说,我不相信他之前没做过功课。他也肯定会料到,中国队可能会请他去做主教练。只要有这个可能性在,他就有所准备。

中国球员都是什么水平,中国球员存在什么问题,如何提高中国球员责任心和积极性,如何同政府领导打交道,在恒大的这几年里,应该小有收获吧。

3、如此高龄,如此高年薪,意欲何为?

我是相信银狐这是给自己一个挑战。而不是英雄迟暮不要脸的大捞一笔。(我不了解这老头,更不了解他儿子)

话说,请谁我都觉得难免被骂。这个位置简直是烫手的山芋,如果你要脸,分分钟让你下课。。

里皮老矣?尚能教否?里皮算不上老,我觉得能教。68岁还好,常委们的平均年龄,和里皮差不多吧。北京90多岁的老头谈笑风,精神矍铄的也不少。只要身体和精神可以,客观上就没有什么问题。

至于是否与小里皮的财务危机有关,我就不得而知了。。

4、里皮的困难是巨大的。

你是我带过最差的一届,这句话描述里皮和中国足球队的关系再恰当不过了。

里皮以往的执教,可能是将优秀的球员组织起来,同时通过向关键位置引进外援,来弥补短板。

执教国家队后,主要方向应该在,提高球员整体身体素质,基本功,兴趣、责任观念上。引进现代化、职业化训练体系。

平时球员都在俱乐部踢球,怎么系统性、持续性训练也是个问题。

3年改变一支国家队,虽然有困难,但是也可以做到。

我看新闻里说:足协承诺将球队一切权力(技战术制定、用人、排兵布阵、甚至奖金分配)交给里皮。(虽然足协官网并没有提到这一点:http://www.fa.org.cn/news/china/2016-10-22/514105.html)

我觉得,这一点应该是里皮要求的,或者双方一拍即合,反正这应该是里皮的底线吧,如果连这一点都做不到,里皮还真是来拿钱走人的啊?

 

生活随笔

之前一篇关于Java编码的文章请见:http://www.liuzhaocn.com/?p=1166

 

可以简单的将与Java有关的字符编码分成两类

1、Java源文件及JVM编码。

2、关联系统传递给Java程序的字符编码。

谈到编码,基本上我们指的是字符编码,即人类可阅读的文字在计算机中的存储与显示,其他类型编码我不懂,就不讨论了。

 

先说第一种情况。Java源文件及JVM中,字符是怎么表示的。又分两种:

1.1Java文件保存编码。

1.2JVM虚拟机运行编码。

 

1.1

我们用eclipse或者notepad++或者vim写了一个.java源文件,将其保存的时候,可以选择ANSI,GBK,UTF-8等。

实际在硬盘存储的文件编码格式,是根据用户的选择,具有多样性。

 

 

1.2

Java编译器在对源文件编译前,首先会源文件转换为Unicode编码,然后再进行编译。

比如:javac Demo.java

默认采用操作系统的编码解码Demo.java,比如,我们将Demo.java按照UTF-8保存成文件,操作系统默认编码是GBK,则编译的时候就会报错。

这时候需要指定保存的.java文件的编码格式。用:javac -encoding UTF-8 Demo.java

编译之后的.class文件中的字符,都是Unicode编码(具体来说是UTF-16BE)。

 

2、

先说一个很基础的类:java.lang.String类。String类型在JVM中存储的是Unicode编码(UTF-16BE)。同理char类型也是(16位,2字节)。

错误的理解:

以前,我总以为String类是有不同的 编码格式的,比如这个String是UTF-8的,那个String是GBK的。

比如:

byte[] bytes=…;

String newStr = new String(bytes, “GB2312”);

以前总模糊的使用,总以为是将string设置为GB2312,或者意味着将字符串由GB2312转换成了源文件的保存格式(比如UTF-8)。

正确的理解:

给定的输入源bytes的编码格式是GB2312,用GB2312解码bytes,并转换成Unicode编码(具体说是UTF-16BE)。JDK文档里说的清楚:

通过使用指定的 charset 解码指定的 byte 数组,构造一个新的 String。新 String 的长度是字符集的函数,因此可能不等于 byte 数组的长度。当给定 byte 在给定字符集中无效的情况下,抛出UnsupportedEncodingException异常。

跟Java程序关联的其他系统,向Java程序发送字符的时候,就有可能出现问题。

常见的关联情况有:前台表单填写、文件读取、数据库读取、SOCKET通信、其他关联等。

基本上都是IO操作,最终传过来的信息以字节数组byte[]的方式需要Java程序处理。以从数据库中读取文本为例。

ResultSet rs;
bytep[] bytes = rs.getBytes();
String str = new String(bytes, “gb2312”);

首先需要知道文本在数据库中存放的格式,在这里是GB2312,这样才能正确的将文本读取到str对象中。

有时候我们会碰到这种写法来处理乱码的问题:

str = new String(str.getBytes(“iso8859-1”), “gb2312”);

这是因为str之前用错误的iso8859-1进行了解码,用iso8859-1编码还原成原来的byte[],再用正确的gb2312进行解码。

再说一下char类型,char类型在Java中16位存储,2个字节,与UTF-16位数一致,所以char[]与String的效果是一样的。

Java

两军问题是计算机领域的一个思想实验,用来阐述在一个不可靠的通信链路上试图通过通信以达成一致是存在缺陷的和困难的。这个问题和更有名的“拜占庭将军问题”有关(译者注:拜占庭将军问题很早就被提出,但是没有普及,后来为了普及,采用故事的方式来说明问题,并命名为拜占庭将军问题),并且经常出现在计算机网络课程的开头(特别是由于解释传输控制协议中的TCP协议并不能保证通信两端状态的一致性)。不过两军问题适用于任何有可能通信失败情况下的两点通信。在认知逻辑上一个重要概念是,两军问题强调了常识的重要性。也有些学者称之为“两军悖论”、“两军难题”、“协同攻击问题“等。两军问题是在计算机通信领域首个被证明无解的问题(译者注:据说量子通信可能会解决此问题),由此也可推论出,随机通信失败条件下的“拜占庭将军问题”也同样无解。

[定义]

两支军队,分别由两个将军领导,正在准备攻击一个坚固的城市。两支军队都驻扎在城市旁边的两个不同的山谷里。两军之间隔着第三个山谷,两个将军想要通讯的唯一方法就是穿过第三个山谷传送信件。问题是,第三个山谷被城市的守卫军占据,并且经此传送的信件可能会被守卫军截获。

虽然两个将军商量好要同时对城市发起攻击,但是他们没有约定特定的攻击时间。为了保证取胜,他们必须同时发起攻击,否则任何单独发起攻击的军队都有可能全军覆没。他们必须互相通信来决定一个同时攻击时间,并且同意在那个时间发起攻击。两个将军彼此之间要知道另一个将军知道自己同意了作战计划。(译者注:A同意了作战计划,A将同意作战计划的信发给B,A将军要知道:B知道了A同意了作战计划。)因为返回来的信件和送出去的信件一样容易丢失,未来大量的消息必须保持一致性。

这个思想实验致力于考虑两军怎么做才能达成一致。在最简单的情况下,其中一个将军作为领导人,决定着发起攻击的时间,他必须将这个时间准确无误地通知另外一个将军。现在的问题是提出一种两个将军可以使用的算法。这个算法包含发送和接收处理消息,并正确地做出决定和推断:

没问题,我们会在约定的时间同时发起攻击。

考虑到两个将军达成同时攻击的约定非常简单(例如,每一个成功发出去的信件,必须有一个成功的返回)。两军问题的微妙之处在于,对于上面的情形,不可能设计出一种能安全使用的算法。

220px-2-generals-svg

军队位置图。A1和A2军队需要通信,但是他们的信息有可能被B军队拦截。

 

[问题描述]

A将军可以先发送一个消息:八月4日9点发起攻击。但是,一旦消息发送出去,A将军并不知道B是否收到了这个消息。这种不确定性使得A将军攻击之前非常犹豫,因为有独自发起攻击的危险。

为了让A将军放心,B将军可能要发送一个确认的返回信息给A将军:“我收到了你消息,我会在八月4日9点发起攻击”。可是,这个给A将军的确认消息也面临着被守卫军截获的可能,B将军也犹豫了,如果A将军没有收到确认信息,那么A将军很有可能停止此次攻击。

[证明]

带有特定消息数量的确定性协议。

因为协议是确定性的的,假设有一个固定数量消息的队列,一些消息成功发送了,另一些失败了。假设两个将军有一个明确的攻击目标。

考虑最后一条消息成功送达。如果最后一条消息没有成功送达,至少有一个将军(很有可能是接收这条消息的将军)估计会不进行攻击。从最后一条消息发送者的角度出发,已发送的和已送达的消息队列顺序和预想的一致,并且包含所有已发送的消息。

因为协议是确定性的,最后一个发送消息的将军依然决定发起攻击。这样会形成如下情形:这个协议让一个将军发起攻击,另一个将军不发起攻击。这个情形与这个协议能解决两军问题的假设相矛盾。

不确定性和变长协议

一个带有变长消息的不确定性协议就像一个有限的森林,每个叶子或者分支(节点)代表一个被发现的相当于特定点的实例。

森林的根节点标记着第一条合适的消息。由根节点衍生出来的分支节点标记着合适的下一条消息。叶子节点代表发送了最后一条消息的实例。在发送任何消息之前,这个协议就是一棵空树。

假设有一个不确定性协议可以解决两军问题。那么,根据之前确定性协议的场景和分析,可以从一棵树去掉所有叶子节点,得到另外一棵树。也就是说,确定性协议一定也可以解决两军问题。

因为不确定性协议是有限的,由此可推断一棵代表空树的协议,也可以解决两军问题。很显然这是扯淡。所以不存在一个不确定性协议可以解决两军问题。

[工程方法]

一个解决两军问题实际可行的办法就是接受而非试图去消除通信信道的不可靠性,但是要将这种不可靠性降低到可以接受的程度。例如,A将军可以送出100个信使,并预期所有信使被抓的可能性是极低的。用了这种方法,A将军无论如何都会发起攻击,B将军只要收到一个信使的信,也会发起攻击。

一个类似的方法是,A将军发起一连串消息,B将军对每一个消息都返回一个应答消息。两个将军对每个返回的消息都感觉是充分的。

但是正如证明里看到的那样,无法确定攻击是协调一致的。没有一种可用的算法(比如收到4个消息)一定能防止只有一个将军发起攻击。

同样的,A将军可以给每一个发送的信息编号,从1到n。这种方法可以让B将军了解信道的可靠性,并且发送适当数量的返回信息来保证至少有一条信息会被收到。如果这个信道是可靠的,一条消息足够了,其他的消息都没什么用了。最后一条消息和第一条消息一样容易丢失。

假设每发送一个消息并被拦截时,将军将会牺牲一批士兵,那么我们可以设计这样一种算法,使得用最少的消息通信换取协同攻击的最大化确认。为了达到这个目的,发送方使用停止发送信息的方式表示已收到至少一次确认信息并承诺发起攻击。假设每个消息通过危险区需要1分钟,发送方收到确认信息后沉默200分钟,这样可以既不用牺牲更多的士兵又能达到高可靠的协同可信度。也就是说,只有当接收方没有收到攻击时间时发送方才会继续发送消息。发送方沉默200分钟后,接收方将得出以下结论:一种可能是连续200个消息都被敌方截获(显然概率极低);另一种可能是对方已收到我的确认信息也相信我将发起攻击,对方也将发动攻击。

[历史]

两军问题及其无解性证明1975年被E. A. Akkoyunlu、K. Ekanadham和R. V. Huber首次提出。发表在《网络通信设计的约束与权衡》一文中。它在73页的开头用来描述两个匪徒团伙之间的通信。

1978年,Jim Gray在《数据库操作系统笔记》的465页,将这个问题命名为“两军问题”。这个引用被普遍地认为是最早的两军问题的定义和无解证明,但是正如上一段说的,其实他们早就被发表了。

译者注:

翻译原文是维基百科条目:Two General’s Problem

https://en.wikipedia.org/wiki/Two_Generals%27_Problem

本人水平有限,有问题的地方,欢迎大家批评指正。

我的翻译 技术杂谈

知法是前提,守法是关键,敬法是目标

习近平总书记在庆祝中国共产党成立95周年大会上的讲话指出:改革和法治如鸟之两翼、车之两轮。我们要坚持走中国特色社会主义法治道路。坚持党领导立法、保证执法、支持司法、带头守法。要在全社会牢固树立宪法法律权威,弘扬宪法精神,任何组织和个人都必须在宪法法律范围内活动,都不得有超越宪法法律的特权。

作为中国农业银行软件开发中心的一名中共党员,通过参加“知法·守法·敬法”警示教育活动和学习党纪党规活动,体会颇多。

一、知法是前提

无知犯法,罪行同等。党员干部因不懂法而导致法治观念淡薄,甚至获刑的案例比比皆是。如果说知法犯法的行为是胆大包天,那么不懂法犯法的人,则可悲之极。不知法,做事情就没有一个心理的准绳,没有心理高压线,在糊涂的情况下葬送了自己的前程。只有知道了什么是法律规定可以做的,什么是不可以做的,才可以根据法律树立自己的底线和原则,就有了拒绝违法行为的强大理论基础。

中国农业银行软件开发中心要让每个员工做到知法、懂法,就要不断宣传法律知识。同时,举行生动、震撼的案例展示,做到不断强化思想、防微杜渐。员工不但要学习知识技能,业务知识,更要把学习相关法律知识作为提高个人修养的一种方式。作为一名中共党员,工作之余,我认真学习了《中国共产党廉洁自律准则》、《中国共产党纪律处分条例》内容,并在“党章党纪党规考试 ”中取得满分的成绩,对身边的同事起到学法的带头作用。

  • 守法是关键

知法犯法,法不容情。知法犯法,有两种可能:关不住欲望的牢笼、忍不住人情的请托。人无完人,大多数人都会有欲望,比如金钱欲望、权力欲望和性欲望。过于强烈的某方面欲望和别有用心的诱惑,就会使人失去理智,走上违法犯罪的道路。另外,一个个小的欲望总是得到满足,最终会欲壑难填,置法律于不顾,纵使知法,也铤而走险,最终受到法律的制裁。此外,在中国这样的人情社会,亲情和友情是联系人们的纽带,带给人们很多欢乐,可同时,没有原则没有底线的使用人情,反而可能对双方不利。道不同不相为谋,对于三观不一致的朋友,对于过分的要求要尽早拒绝。

所以每一个公民、每一位同事、特别是党员干部要经常三省吾身,认清自己的欲望,将欲望转移为健康的兴趣爱好,最主要的是远离危险的诱惑。坚持自己的原则,只有自己是对自己负责的,不要让人情把自己送进监狱。只有坚持守法才是真正远离犯罪,不忘初心的选择。

三、敬法是目标

美国法学家伯尔曼说:“法律必须被信仰,否则形同虚设。”敬法,是更高层次的守法,是心理层次上的守法,是可以与欲望相抗衡的思想力量。要做到敬法的层次,不仅对被管理者提出了更高的要求,也对管理者提出了更高的要求,它需要双方共同推进。

首先要做到违法必惩。大到一个国家,小到一个公司,对于违法违纪行为不姑息,追查到底,严惩不贷,才能形成良好的社会风气。只有对法律形成敬畏之心,才能将违法行为遏制在萌芽阶段。再次,应该让大家应该认识到法律不是束缚大家创新和生产的枷锁,而是保障、引导和推进社会主义建设的规范。

执纪当先守纪,正人必先正己。知法、守法、敬法不是畏首畏尾,而是政治上的成熟,思想上的自信,因为心中有尺度。

生活随笔