2009年3月27日星期五

MatLab出错

今天终于要调matlab的代码了,可是居然出现问题。
当鼠标选中matlab编辑器中的文件后,被选中的文件会消失!
...
困扰很久后发现原来是灵格斯翻译软件的原因,只要关闭了它的划词翻译功能就不会出现这问题了。

2009年3月25日星期三

[转]社会心理学读书笔记

2个礼拜终于断断续续的读完了这本厚达600多页的大本教材。这本书从个体和社会着手进行了分析。昨天终于看到了首尾之作--“临床心理学”,总结了一点生活中的法则。
  
  1。事实证明,乐观的心情确实能增强对于疾病的抵抗能力,那些患心脏病的人多数缺乏耐心,暴躁,易被激怒。
  2。任何事情如果事先是自愿参加,并且在过程中付出努力,结果会更加有效,持续的好效果也会更加持久,比如减肥。
  3。每个人在取得成功的时候都会归功于自己的努力和能力,而在失败的时候却会埋怨周围的人和环境,下次失败的时候不妨倒过来想。
  4。在吵架和发生冲突的时候,不妨换个角度考虑一下对方的感受,而且对事不要对人。
  5。如果你是公司的领导或者决策人甚至ceo,coo,cfo,ufo……当制定策略和销售任务的时候不要把目标制定的过高,这样会给下属很大的压力,如果没有完成任务,会带来更大的挫败感。
  6。在会议或群体中,当少数派非常不容易,鼓励这种行为,并多听听反对意见。有时候人的从众心理,更容易犯决策性的错误。
  7。不要过于关注自己的外在形象,你被关注的几率没有你想象的那么高。
  8。我们总是认为自己的团体是最好的,但实试着接受不同的团体,不同的人,多听听和你意见相左的人的意见,有时会更有启发。
  9。许多重大的消极的事件带给你的痛苦,没有你想象的那么严重。同样,兴奋的事情也不会给你带来更多更持久的快乐感。因此残疾病痛贫穷你也会很快的适应,同样豪宅名车并不能让你幸福一辈子。
  10。少关注自我形象,多关注自己的才能和人际关系,才会带来更多的幸福感。
  11。团体的力量会更容易引发犯罪及不道德的事情,因此在团体里面尽量控制自己,不要轻视煽动和教唆的力量。
  12。如果2个选择一起给出,过了一段时间再让对方选择,他们会选择第1个,如果第一个选择过后隔一段时间再给出第2个,马上选择时对方会选第2个,如果你想让对方同意你的意见,你知道该怎么做了吧?
  13。“登门槛”效应,当你同意帮一个小忙,你还会同意帮一个大一点的,所以答应一件事前,想清楚这件事会带来什么样的后果。
  14。态度决定此行为,行为也会更加坚定你的态度。
  15。把工作和兴趣分开,为了报酬的兴趣会慢慢变成负担,而不再是兴趣。
  16。少看电视,色情暴力网站和杂志,远离那些为了PV,收视率,金钱不惜做任何事情的媒体,这些东西更容易让你沉迷于色情和暴力之间,从而更容易引发犯罪。
  17。在婚姻中,丈夫和妻子的相似性越大,婚姻也就越幸福和长久。
  18。群体会减弱里面的个体对事件的关注程度,他们都认为别人会有所反映。地铁或者公车上,“见死不救”的场景正好说明了这个理论。
  19。不要以自我经验为准,多以客观事实和调查数据为依据。
  
  大概总结出来这么多,其实很多都是日常生活中就能感觉到的,但是很多人往往忽略,所以做个笔记出来,就当共勉吧。

2009年3月22日星期日

“奖金门”争论中震耳欲聋的沉默

靠政府救助才免遭破产的AIG要发给员工上亿美元的奖金。这件事在美国朝野引起了极大反弹。从总统,国会议员到普通百姓,多数人都气愤难平:纳税人的救援,怎么落到了这帮始作俑者的腰包?是否应该追回这些奖金,如何追回,成了最近的热门话题。按照美国政治的习俗,将这事称为“奖金门”,也是顺理成章的了。

其实,虽然上亿美元不是小数目,AIG奖金的事却只是美国金融业以致整个经济体系积疾的冰山一角。君不见,日前报道说,另一个因财务危机而被收购的投行Merrill Lynch在去年发了更多的奖金。其他限于困境的投行,对自己的经理和员工也是“慷慨解囊”。人们不仅要问,这些“奖金”,所“奖”的是什么?

更能反映问题严重性的,是这场争论中缺失的两个“主角”:接受奖金的投行经理和发出奖金的投行股东。他们的沉默,值得我们深思。

人们通常认为经理们得到高薪金有两个理由:一是他们为企业创造了(带来了)巨大利润,二是他们承担了一定个风险。但是在企业遭受灭顶之灾时,他们为什么还是照样“财源滚滚”?他们既带来了巨大损失又不承担个人风险,他们如何能心安理得?可惜,没有人出来回答。华尔街那么多高层管理,居然没有人出来,或者说他们拿得应该,或者说自愿放弃奖金。甚至国会议员们多次放话希望他们自愿退出奖金,都没有人回应。这种表现,除了“令人心寒”以外,我真不知道应该如何形容。其实这也难怪。在金融界,从商学院到公司的招工选材,“贪婪”都是作为优点的。据说,能为自己争取最大利益的人,才能为公司争取最大利益。但是,高管们是企业的“守护者”而不是所有者。他们有责任把股东的利益,而不是把自己利益,放在第一位。然而现实上,高管以种种手段为自己谋利,而不惜伤害到企业。这种高管与公司的利益冲突,不仅在华尔街,而是在美国所有公司,特别是上市公司都存在。可惜的是,在企业表现好的时候人们不会关注。而企业遇到困境时,又似乎得罪不起这些高管,尽管正是他们造成了这困境。即使将他们解雇,还得提供“黄金降落伞”。如此下去,才到了今天这样的荒唐局面:在华尔街高管的行为造成企业大伤元气而需要纳税者救援时,他们还好意思拿着“合同”来要钱,而且是躲在“薪酬顾问”的背后。这种品德还值得托付吗?当华尔街都是这样的人的话,这个行业还有未来吗?这是一个值得深思的问题。

说到“合同”,我们应该要问:谁与谁订的合同?在这个过程中谁代表股东的利益?这又是美国经济体制的一个大问题:机构投资者的失职和普通股民的无力。企业的最高权力机构是董事会,通常由大股东和行内专家组成。目前,企业的大股东通常都是机构投资者如退休基金,公共基金等。他们运作的目的是通过投资交易赚钱,而不是把某一个企业办好。他们感兴趣的是预测企业的价值而不是提高企业的价值。所以,董事会的实际掌权者就是企业的首席执行官(CEO)和他的同行(也是其他企业的高管)了。我们知道,协调高管与企业之间的利害关系本来是董事会的重要工作。而如今,董事会和高管成了一家,而真正的股东就被晾在一边了。所以,是谁与谁订的合同?可以说是CEO的左手和右手订的合同。如何在企业管理中体现股东利益,行使股东权力,这也是一个亟待解决的问题。这次“奖金门”中我们根本听不到那些“大股东”的声音,就反映了这个问题的严重性。

本来,如何确定高层管理人员的报酬是企业管理中的一个专业问题。但是现在,华尔街的奖金成为了一个政治话题。这是相当不幸的,因为华盛顿的政客们没有足够的专业知识和信息来解决这个问题,很可能越搞越糟,后患无穷。这个恶果不幸还是要你我来承担。但是我们不要忘记恶因是什么。这些恶因不除,即使经济危机过去了,“奖金门”或其他的“门”还是会把美国企业的活力和竞争力消耗殆尽。

【注】关于AIG时间中反映出的高级管理薪酬问题,《纽约时报》的这篇文章说得比较全面,清楚。http://www.nytimes.com/2009/03/18/business/economy/18leonhardt.html?_r=1&hp 【注】有一种为奖金的辩护说法:涉及奖金问题的很多人,他们与金融危机的造成并没有直接关系,不应该受到株连。我认为这种说法很弱。因为他们的奖金与不受他们控制的企业表现挂钩,这是没有办法避免的事。在企业表现好的时候,他们因为别人的功劳而得到奖金。当企业倒霉的时候,他们也因为别人的过错而倒霉,这也是公平的。

2009年3月19日星期四

当心: Ext4 可能造成数据丢失

Ext4无疑是08年文件系统界最出风头的文件系统,linux内核加入了对其的支持,标志着已经较为成熟可以投入使用了,凭借Ext3的广泛适用和直接从Ext3升级到Ext4的能力,Ext4的推广是不成问题了。

但是最近还是出现了一些问题,正在使用 Ext4 文件系统的同学可得当心了。据某些用户反映,它可能会造成你的数据丢失。国外一位 Kubuntu Jaunty 的用户称,使用 Ext4 文件系统使他丢失了大量的数据,相关描述可参见位于 launchpad 上的 bug 报告。

无独有偶,国内的 albert748 也遇到了类似的问题。他描述道,X 无缘无故死掉,断电重启后,发现 Firefox 的配置丢了很多。与上面那位国外用户一样,albert748 也使用 2.6.28 内核和 Ext4 文件系统。

今天,H-Online 刊登了一篇文章 Ext4 data loss; explanations and workarounds,其中对此进行了解释,并包含 Ext4 开发者 Ted Ts'o 提供的解决方案,有兴趣的同学可去看看。

2009年3月16日星期一

可能导致Java内存泄漏的几项原因

ava的一个重要优点就是通过垃圾收集器(Garbage Collection,GC)自动管理内存的回收,程序员不需要通过调用函数来释放内存。因此,很多程序员认为Java不存在内存泄漏问题,或者认为即使有内存泄漏也不是程序的责任,而是GC或 JVM的问题。其实,这种想法是不正确的,因为Java也存在内存泄露,但它的表现与C++不同。
  在Java中,内存泄漏就是存在一些被分配的对象,这些对象有下面两个特点,首先,这些对象是可达的,即在有向图中,存在通路可以与其相连;其次,这些对象是无用的,即程序以后不会再使用这些对象。如果对象满足这两个条件,这些对象就可以判定为Java中的内存泄漏,这些对象不会被GC所回收,然而它却占用内存。
  在C++中,内存泄漏的范围更大一些。有些对象被分配了内存空间,然后却不可达,由于C++中没有GC,考试,大提示这些内存将永远收不回来。在Java中,这些不可达的对象都由GC负责回收,因此不需要考虑这部分的内存泄露。
  注意事项:
  1、最基本的建议是尽早释放无用对象的引用。如:
  ……
  A a = new A();
  //应用a对象
  a = null; //当使用对象a之后主动将其设置为空
  …
  注:如果a 是方法的返回值,不要做这样的处理,否则你从该方法中得到的返回值永远为空,而且这种错误不易被发现、排除
  2、尽量少用finalize函数。它会加大GC的工作量。
  3、如果需要使用经常用到的图片,可以使用soft应用类型。它尽可能把图片保存在内存中
  4、注意集合数据类型,包括数组、树、图、链表等数据结构,这些数据结构对GC来说,回收更为复杂。
  5、尽量避免在类的默认构造器中创建、初始化大量的对象,防止在调用其自类的构造器时造成不必要的内存资源浪费
  6、尽量避免强制系统做垃圾内存的回收,增长系统做垃圾回收的最终时间
  7、尽量避免显式申请数组空间
  8、尽量做远程方法调用类应用开发时使用瞬间值变量,除非远程调用端需要获取该瞬间值变量的值。
  9、尽量在合适的场景下使用对象池技术以提高系统性能

JVM结构基础(二)

最近为了一次重要的面试正在恶补java,发现了很多以前模糊的概念,推荐一片不错的文章。值得珍藏。原文来自http://www.javaresearch.org/article/11510.htm

通过上一篇文章的介绍我们了解了JVM中数据类型以及数据区的知识,这篇我们会通过对JVM堆栈的帧的详细介绍了解方法执行的一些内幕。

帧通常用于存储数据和部分结果,同时还用于执行动态链接、返回方法的返回值以及分发异常。
帧在方法调用的时候被创建,在方法完成的时候销毁。它是在创建它的线程的JVM堆栈中分配到空间的,每个帧都有它自己的局部变量数组、操作数堆栈和一个当前方法所在的类的运行时常量池的引用。
它的局部变量数组和操作数堆栈的大小是在编译的时候就确定了的,而且它是和它所联系的方法的代码一起提供的,因此它的数据结构的尺寸仅仅依赖于JVM的实现和方法调用时同时可以分配的内存。
对于正在执行的方法而言只有一个帧是活动的,这个帧就是所谓的当前帧,它的方法就是当前方法,当前方法所在的类被定义为当前类。局部变量和操作数堆栈的操作通常和当前帧有关。

如 果一个帧所在的方法调用了另外的方法或者方法结束,那么该帧不再是当前帧。如果是调用另外的方法,那么一个新的帧会被创建并且在控制权转换到新方法时成为 当前帧;如果是方法结束,如果有方法返回,当前帧将它的方法调用的结果传递给前一个帧,当前一个帧成为当前帧时当前帧被丢弃。

需要注意的是由一个线程创建的帧是局部于该线程的,其它的线程不能引用它。

每个帧都包含变量数组,也就是我们所熟知的局部变量数组。一个局部变量可以保存一个boolean、 byte、char、short、int、float、引用或者returnAddress值,一对局部变量才能保存一个long或者double值。
局部变量是根据索引进行寻址的,第一个局部变量的索引是0。如果一个整型值介于0和局部变量数组的长度之间并且也只有在这个区间的时候它才会被作为局部变量数组的索引。
long 型或者double型的值占用两个连续的局部变量,这样的值可能只能使用较小的那个索引值进行寻址,例如,局部变量数组中索引为n的double变量值实 际上占用n和n+1,但是局部变量n+1是不能读取的,它可以被写入,但是这样做会使得局部变量n的内容无效。JVM没有要求n是偶数,这就意味着 double和long型值在局部变量数组中不必是64位对齐的,JVM的实现者可以决定使用适当的方式表示那样的值。

JVM使用局部变量传递方法调用的参数,对于类方法调用(也就是static方法),所有的参数都是连续的存储在局部变量表中并且是从0开始的,对于实例方法调用,所有的参数也是连续的但是是从1开始的,局部变量0存储的是实例方法所在的类实例的引用。

每个帧都包含一个后进先出的堆栈,也就是它的操作数堆栈。

操作数堆栈在刚刚被创建的时候是空的,JVM提供指令从局部变量或者成员加载常量或者值到堆栈,其它的JVM指令从操作数堆栈提取操作数,操作它们并将结果放回操作数堆栈。操作数堆栈也用于准备传递给方法的参数以及接收方法的结果。
例如一个iadd指令将两个int值相加,该指令要求它的前一条指令将它要相加的两个值压入操作数堆栈的最上面,它从操作数堆栈取出那两个值进行相加并将结果放回操作数堆栈。
子计算可能是嵌套在操作数堆栈中的,产生的值可以被嵌入的计算使用。

操作数堆栈的每一项都可以保存JVM的任何类型的值,包括long和double型的。

操 作数堆栈中的值必须根据其类型进行操作。下面的这些情况都是不可能的:压入两个int值而后续的操作将它们作为long型或者压入两个float值而后续 的操作是iadd指令(该指令的操作对象是两个int型)。有一小部分JVM指令(例如dup和swap)将运行时数据区的值作为原始的值 (raw value)进行操作而不考虑其类型,这些指令是以一种不能用于修改或者分解单独的值的方式定义的,这些对操作数堆栈操作的限制通过类文件验证 进行了强制。

在任何时候操作数堆栈都有其相应的深度,long或者double型的值是两个单位而其它的值是一个单位。

每 个帧都包含一个相应于当前方法的类型的运行时常量池的引用以支持方法代码的动态链接。类文件代码中的方法代码指的是被调用的方法以及通过符号引用可以访问 的变量,动态链接将这些符号方法引用翻译为具体的方法引用、在必要的时候加载类以解析未定义的符号以及将变量访问翻译为那些变量的运行时位置在存储结构中 的适当的偏移。方法和变量的晚期绑定使得方法使用到的其它类的变化可以破坏该代码的可能性更小。


如果方法调用没有导致一个异常(无论是JVM抛出的还是代码显式抛出的)就被认为是方法调用正常结束。如果当前方法调用正常结束,那么一个值可能被返回给调用它的方法。
在这种情况下,当前帧被用于恢复调用者的状态,包括它的局部变量和操作数堆栈以及适当增加程序计数器以跳过方法调用指令。方法调用者所在的帧的程序的执行正常的继续,如果有方法返回,返回值被压入帧的操作数堆栈。

如 果方法里面的一个JVM指令的执行引起JVM抛出一个异常并且那个异常在方法里面没有被处理就会导致方法调用突然结束,执行一个athrow指令也可以导 致一个异常被显式的抛出并且如果那个异常没有被当前方法捕获也可以导致方法调用突然结束,一个突然结束的方法调用永远也不会向它的调用者返回一个值。


一个帧可能会被像调试信息这样的与实现相关的特定信息扩展。

JVM结构基础(1)

最近为了一次重要的面试正在恶补java,发现了很多以前模糊的概念,推荐一片不错的文章。值得珍藏。原文来自http://www.javaresearch.org/article/11280.htm



前段时间由于研究原来广为传播的String和StringBuffer的性能问题,自己做了几个小实验并得出一些结论,但是从网友的反 应来看那个研究并没有起到应有的目的,而且网友也很中肯的提出了自己的意见并对实验中的一些内容指出了其缺陷,针对他们的反应我又反编译了代码来进行对 比,但是几位网友仍然不是很信服,而且上次实验的结果和反编译得到的结论并不能完全吻合,因为反编译代码的对比基本上是基于语句的多少,因此这个这个对比 也确实不能使人信服,但是这给我的下一步行动指引了方向:研究JVM指令和JVM结构,在对反编译后的代码有完全的理解才能给出可能使人信服的结论。

本文以及以后将要写的一些文章就是我研究JVM规范的一些心得,我希望在和大家共同理解的基础上进行我们下一轮的深入研究。

好,闲话少说,开始我们的正文。

JVM 执行的对象就是大家非常熟悉的class文件,我们也称为类文件,JVM规范定义的这个编译完成的代码文件(虽然并非强制要求是实际的文件)的格式非常的 详实,但是我们这里只说一些宏观的内容,以后有机会再研究细节的内容吧。JVM要求的类文件的格式是和硬件和操作系统无关的一种二进制格式,它精确定义了 类或者接口的表示,它甚至包含了字节顺序这样的细节,而字节顺序在特定平台的目标文件格式中一般都是固定的,不会进行说明。

JVM所支持 的数据类型和Java语言规范中定义的几乎一样,请注意是几乎一样!也就是原始类型和引用类型,他们可以被存储在变量表中,也可以作为参数传递、被方法返 回,更通常的就是成为操作的对象。为什么和Java语言规范中定义的不完全一样呢?因为JVM中有一种Java语言所没有的原始类型:返回地址类型 (returnAddress type)。该类型是jsr, ret以及jsr_w指令需要使用到的,它的值是JVM指令的操作码的指针,并且它的值是 不能被运行中的程序所修改的。

另外需要提到的就是布尔类型的值,虽然在Java语言中它是完全独立的值,但是在JVM中只提供了对它的有限支持,表现在:
没有单独的操作布尔类型的指令,源代码中的布尔类型的操作在编译以后是作为int类型的值进行操作的。
JVM直接支持布尔数组,newarray指令可以创建布尔数组,而它的访问和修改操作却是使用byte类型的数组的操作指令进行的:baload,bastore。(在JDK1.0,1,1以及1.2中,布尔数组被编码为byte数组,每个元素是8位)
JVM用1代表true,用0代表false,编译器将源代码中的布尔类型映射为JVM中的int类型,而且必须和JVM的要求一致。

另外JVM规范中对于浮点类型的数据有大段的说明,我没有怎么看,主要是讨论JVM的浮点型和IEEE 754的关系的。

关 于类型的另外一个需要提一下的是类型检查。JVM期望几乎所有的类型检查已经在运行之前完成了(通常是由编译器进行检查的)而不用JVM自己来检查。原始 类型的值不需要被标记或者在运行时被检查以确定他们的类型,同样他们也不用和引用类型的值进行区分,区分工作是由JVM的指令集来完成的,JVM的指令集 使用不同指令来区分它要操作的值的类型,例如iadd, ladd, fadd以及dadd是用于将两个数字相加并产生数字类型结果的所有JVM指令,但 是每个指令都是针对特定类型的,分别对应int, long, float以及double。

JVM包含对对象的显式支持。类是动态分配的类实例或者是一个数组,JVM中的引用类型就是对一个对象的引用,引用类型的值可以想象为对象的指针,一个对象同时可能存在多个对它的引用,对象总是通过引用被操作、传递或者测试的。

对于引用类型,需要提及的一点就是关于null,它最初是没有运行时类型的,但是它可以被转换为任何类型,而且对于null,JVM并没有要求任何具体的值与之对应。

说完上面这些,我们就开始进入我学习JVM时最想了解的部分了,大家可要打起精神哦。
JVM 为运行一个程序定义了几种数据区(Data Area),包括:pc寄存器、JVM堆栈、堆、方法区(Method Area)、运行时常量池 (Runtime Constant Pool)以及本机方法堆栈(Native Method Stacks),这些数据区根据其生存期可以分为两种, 一种就是和JVM的生存期相同(包括堆和方法区),一种和线程的生存期相同(其它的),和JVM生存期相同的数据区在JVM启动的时候被创建并在JVM退 出的时候被销毁,而和线程生存期相同的数据区是每个线程一个的,他们在线程创建的时候被创建,在线程被销毁的时候被销毁。

由于JVM可以 同时支持运行多个线程,因此每个线程必然需要各自的PC(program counter)寄存器,无论从什么角度讲,每个JVM线程只能在一个时间只能 执行一个方法,该方法也就是线程的当前方法,如果该方法不是本机方法,那么PC寄存器保存的就是当前指令(JVM的指令)的地址,如果是当前方法是本机方 法,PC寄存器的值就没有被定义。JVM的PC寄存器的大小足够大,可以容纳一个returnAddress类型或者特定平台的本机指针。

每 个JVM线程还拥有一个私有的JVM堆栈,它存储帧(下一篇文章会讲到)。JVM堆栈和像C这样的传统编程语言中的堆栈是类似的,它保存局部变量和部分结 果,并且在方法调用和返回中也担任一些职责。因为除了对帧的压入和弹出操作外,对JVM堆栈不能直接进行操作,因此帧可能是在堆上分配的。如果一个线程中 计算所需的JVM堆栈大于允许的大小,JVM会抛出StackOverflowError错误,如果JVM堆栈是可以动态伸缩的,如果需要扩展,但是又没 有足够的内存可用或者没有足够的内存为一个新线程创建JVM堆栈,JVM会抛出OutOfMemoryError错误。

JVM只有一个为 所有线程所共享的堆,所有的类实例和数组都是在堆中创建的。堆所存储的对象被一个自动存储管理系统回收(也就是我们所熟知的垃圾收集器(gc))。对象不 能被显式的释放,JVM假设没有特定类型的自动存储管理系统,存储管理技术可以根据实现者的系统需求进行选择。如果计算所需的内存堆大于自动存储管理系统 可以使用的大小,JVM会抛出OutOfMemoryError错误。

JVM只有一个为所有的线程所共享的方法区,方法区类似传统语言的 已编译代码的存储区或者UNIX进程的“文本”段。它存储类结构,例如运行时常量池,成员和方法数据以及方法、构造方法的代码(包括用于类和实例的初始化 以及接口类型初始化的特定方法(这些特定方法以后会讲到))。虽然从逻辑上讲方法区是堆的一部分,但是JVM的简单实现可以选择不对方法区进行垃圾收集或 者压缩(以笔者的理解就是类不能进行卸载)。最新版本(第二版)的JVM规范没有要求方法区的位置或者管理已编译代码的策略。如果方法区的内存不能满足一 个分配请求,JVM会抛出OutOfMemoryError。

运行时常量池是类文件中的常量池表的运行时表示,它包含几种常量,范围从编译时就已知的数字常量到运行时必须进行解析的方法和成员引用。运行时常量池扮演的功能类似于传统编程语言中的符号表(symbol table),但是它所包含的数据比典型的符号表更多。
每个运行时常量池时从JVM的方法区中分配的,对于特定方法或者接口的运行时常量池是JVM在创建类或者接口的时候创建的。
当创建一个类或者接口时,如果创建运行时常量池需要的内存比方法区中的可用内容更多的内存,JVM会抛出OutOfMemoryError。
关于常量池创建的更多内容以后可能会更详细的讲解。

JVM 的实现可能使用传统的堆栈(更通常的讲就是C栈)以支持本机方法(不是使用JAVA语言编写的方法),本机方法堆栈也可以用于在像C语言这样的语言中为 JVM指令集实现解析器,对于不能加载本机方法以及自身不依赖传统堆栈的JVM实现而言,它可以不提供本机方法堆栈,如果提供,本机方法堆栈通常在线程创 建的时候为每个线程分配(以笔者的理解应该是需要使用本机方法的线程)。如果线程计算所需的内存比本机方法堆栈所允许的大,JVM会抛出 StackOverflowError错误,如果本机方法堆栈可以动态伸缩,而当需要扩展的时候又没有足够的内存时,或者没有足够的内容用于创建一个本机 方法堆栈,JVM会抛出OutOfMemoryError。

对于上面的这些数据区,JVM规范允许它们的大小是固定尺寸的,也可以是根据 计算的需要动态伸缩的,如果是固定尺寸的,其尺寸可以在创建时自主选择。JVM的实现可以给程序员或者用户提供控制JVM堆栈的初始大小的方法,同样,在 动态伸缩的情况下可以控制最大大小和最小大小,并且它们所使用的内存空间可以不是连续的。

2009年3月8日星期日

推荐两首动漫歌曲

自己最近听到两首有意思的歌,个人认为很不错。
第一首是高达00第二季的ED2:Trust you
试听地址:http://www.dm123.cn/ecms/dmzz/musicol/st/2009-03-02/19798.html
第二首是Bleach的ED(具体是ED几忘了):Velonica
试看地址:http://www.tudou.com/programs/view/JzPVEYALZI0/
都是很耐听的歌曲。

2009年3月4日星期三

看雷锋‘积肥假案’怎样戏弄公众智力

雷锋弄虚作假的种种事迹,常在最浅显的水平上侮辱大众的智力。我们知道,在一般的造假案中,作案人不敢在浅显的水平造假。太浅显的造假一下子就会被人看穿。因此他们总会在比较重要的情节上下些功夫,让它们看上去符合常识,合理可行。下这些功夫多少反映出作案者对大众智力的敬畏。他们是在承认“世人并不好糊弄”的前提下作案的。但雷锋案、黄继光案以及大量其他造假案有一个重要的不同点,那就是作案人公然藐视世人的智力。他们不考虑或不在乎上述前提。因为他们知道打残了大众的智力,使人民大众无力识别或者不敢挑剔他们的骗局。只要D给他们撑腰,事情再假也会永远安全。因此他们作假的前提仅仅是:有D撑腰。这就够了。对于一般造假案,因为案中的假情节大体符合人类常识,公众不容易直接看出虚假。因此破解这种假案比较依赖于内幕知情者的曝光。例如美军“英雄女兵林奇”案中,如果所有当事人都坚持说林奇有英勇反击行为的话,美国大众很难认定林奇事迹有假。直到她本人说她当时其实没有还击时,公众才知道真相。而对于雷锋、黄继光式假案,外界通常不需要当事人揭秘,只凭着普通人的常识即可破案。因为这些假案的情节过于离奇,超出了合理可行的范围。以“林奇英雄案 ”为例,假如该案一开始的报导冒出“危急时刻林奇连开数枪打死五、六十个伊拉克匪兵”这种牛B描述的话,公众当即就能看出虚假,不必再等当事人吐露真相。雷锋积肥假案,就具备这类超出常理的荒诞情节。

一、两次“春节捡粪”。雷锋多次声称他捡粪支援人民公社。光是入伍之后就有两次“春节捡粪”。在1960年的一次录音报告中,雷锋说:“比如,我在过去的一年当中,我想到,一定要在新的一年当中,多做更好更多的成绩。因此,我连过年所放的假都没有休息,我去捡大粪,初一初二那两天我一共捡大粪600来斤。我想到这也是响应D的号召,大积肥,也搞了卫生运动,也能够促进农业生产。”(这次录音报告以 “一辈子学习毛著”为题收入《雷锋全集》)第二年,1961年2月15日,雷锋记述道:“今天是古历大年初一,全连的同志都高高兴兴地到和平俱乐部看剧去了,我呢?为了在春节期间给人民做一件好事,吃过早饭后,我背着粪筐,拿着铁锹到外地拣粪,大约拣了300来斤粪,我送给了抚顺望花区工农人民公社,……”两天后的2月17日,雷锋在日记中又写道:“今天是春节假期的第四天,吃早饭的时候,……我一边吃饭,一边想:春节五天假期过完了,19号就要开始冬训。为了响应D的号召,支援农业第一线,争取今年农业大丰收,我还是去多积点肥,支援人民公社,这样做有两个好处。第一,以实际行动支援农业,对社员们是一个鼓舞,同时也更密切了军民关系。第二,替居民搞了卫生。因小孩在屋前屋后拉了很多大粪,看起来脏得很,我去把大粪捡起来,给居民把地扫干净,这真是一件一举两得的好事,既搞了卫生又积了肥。说干就干,我推着手推车,拿着铁锹和粪筐,走到了望花区北后屯,看见了工人住宅的屋前屋后有很多一小堆一小堆的粪便,我便立刻捡了起来。……到了下午2点钟,我捡了满满一车粪,送给了望花区工农人民公社。人民公社的负责同志们都很受感动。……”雷锋自述的这两次“春节捡粪”共计四天。即每个春节出动两天,其中三天日均产量300斤。最后一天产量是“满满一车”,估计也有300来斤。第一次“春节捡粪”应该发生在辽宁营口市。因为那时雷锋刚入伍才二十天,还在营口市的新兵团受训。第二次发生在抚顺市望花区。如果这两次“春节捡粪”事迹属实,则在两年的春节期间,辽宁省营口和抚顺两市雷锋驻地附近地区要分别提供600斤左右散落于房前屋后的人粪便。这样的任务毫无疑问会使两地居民度过历史上最肮脏的春节。

二、成全雷锋一个人,搞臭望花半座城为了编造“助人为乐”事迹,雷锋要在城市里捡粪。但城市不是捡粪的适当场所。捡粪通常是中国农村地区的劳动。农村地区有许多牲畜在野外放养或者役使,从而提供了一定量散落的粪肥。城市里并不具备这种条件。那个时代里,一般城市还允许骡马大车进入市区。但牲口所散落粪便通常由赶车者搜集,或由城市环卫工人扫除。不可能保留在街道上供雷锋去捡拾。雷锋们看来也不敢指望骡马牛羊猪们在春节期间开进城来帮助雷锋做好事,只好去打“大粪”即人粪便的主意。但是人类恰恰是最不愿意随地排放粪便的动物。即便在农村地区也是这样。中国农民们视人粪便为重要农家肥,非常注意搜集。他们平常总是尽量使用自家茅房,除此之外还四处搭建简易茅厕以搜集他人粪便。捡粪的人在农村地区可能捡到不少牲畜粪便,但很难捡到人粪便。而要在城市里捡“大粪”就更困难了。在城市里,你出钱都不一定能找到人愿意当街脱裤子解大便。雷锋们欲在市区里捡出几百斤大粪,难度实在太高。但那是个“人有多大胆,地有多大产”的时代。雷锋们发扬着时代精神,决意造假。有大粪要捡,没有大粪创造大粪也要捡。从雷锋日记所写内容看,他们知道打成年人的主意并不现实。但这不妨碍他们发挥想像力去开创大粪来源。他们把希望寄托给祖国的下一代:“小孩在屋前屋后拉了很多大粪,看起来脏得很”。让小孩去干脏活,创造条件让雷锋做“好事”。这就是他们的主意。他们大概以为这主意比较稳妥。但事实证明这仍然是个很馊的主意。因为它经不起起码常识的检验。正常情况下,成年人一天排放的粪便量为一百至三百克,小孩的最多百来克。风干后的小孩粪便也就二、三十克。如果要凑足雷锋所需的粪便量,即每个春节300公斤,则营口和抚顺两市要在各春节里分别备好约三千份新鲜儿童粪便或者一万多份风干的儿童粪便。如果以风干儿童粪便满足雷锋“春节捡粪”做“好事”需要的话,则需要500名左右的儿童从腊月初八开始天天到室外排便,直到正月初一。500家的父母如此狠心缺德,自己用着暖暖和和的室内的厕所,却在滴水成冰的季节里天天把孩子逼到室外去排便。不知道这叫什么世道?在此期间,有关部门还需要对这些“雷锋预定捡粪场所”进行一定的管理。既要防止儿童不小心踩坏了“产成品”,更要防止爱干净的人一不小心把保存多日的粪便当作垃圾给打扫清除掉了。春节前大扫除本来是中国人承传了千百年的老传统。现在为了雷锋也必须暂时废止。不但人要配合,老天也要配合:老天不能在这期间里下大雪,否则冰雪会掩盖住粪便。如果解放军装备部不能紧急研制出性能优越的“探粪器”的话,雷锋就无法完成任务。

你看,为了让雷锋同志顺利地做成这件“好事”,需要方方面面多少人们加上神们辛辛苦苦默默无闻地工作呀。那么,用新鲜儿童粪便可以省事一些吗?好像更糟糕。设3到9岁儿童为能够在室外顺利排便的“适龄儿童”。他们约占总人口的5%。这就是说,如果要以新鲜儿童粪便满足雷锋“春节捡粪”做“好事”需要的话,则必须在初一和初二(或初三)两天的上午把一个总人口约三万的小区里的全部约1500名“适龄儿童”都动员起来冒着严寒去室外排便。请问这将是怎样一幅臭气弥漫的春节景象?这样大规模的动员没有行政机构出面是做不到的。谁敢相信,当年营口市和抚顺市某区政府组织过这样规模的“为雷锋叔叔拉泡屎”的春节爱心奉献活动?天下任何一个政府的领导人,需要吃下什么药才能做出这种决策?考虑到多数父母心疼不忍以及孩子怕冷等等因素的影响,被动员区域内的小朋友也不可能都出动参加“为雷锋叔叔拉泡屎”的活动。如果真搞这样的活动的话,出勤率必然是很低的。这一来,为了保证雷锋完成任务,就只能扩大动员区域。为此将拥有十万人口以上的居民区列入动员是完全可能的。这已经相当于当年抚顺市望花区总人口的一半。成全一个人,搞臭半座城。这能算“助人为乐”吗?小朋友们可能要问:雷锋叔叔,您这“好事”怎么做得这么脏啊?如果雷锋没有因公殉职,而是接着往下做这种“好事”的话,岂不是要造成“雷锋春节到哪里,哪里粪便遗满地”的脏乱差景象吗?你会说,本文所设想的情节很荒诞。你说得对。但雷锋白纸黑字写下的这种“好事”,不藉助荒诞手段能完成吗?谁能拿出合理可行的办法?

三、图片为证雷锋“春节捡粪支援人民公社”事迹,毫无疑系编造而成。而且他们编造的东西太离谱,根本无法实现。但雷锋所在部队为了迷惑大众,还专门拍摄了相关题材的照片。照片作者季增更在接受《解放军报》采访时欺骗公众,把虚构摆拍的剧照说成是真实情况记录。《解放军报》2001年3月5日第7版刊登“我给雷锋拍照片的故事”一文。季增在文中谈到以下这张照片摄制过程时说:“一天早操前,我见雷锋挑着粪筐出去捡粪,便赶紧跑回办公室拿相机。等我追到郊外找到雷锋时,雷锋已捡了满满的一筐粪往回返,当雷锋又把粪倒往营房旁的粪堆上时,我拍下这一镜头。”但是这张照片恰恰是雷锋们弄虚作假的证据。在照片里,我们看到雷锋所“捡”的粪明显不一致。除了顶上正从粪筐里倾倒出来的几块“招牌”粪便具有人粪形状外,下面的整整一堆都是骡马粪便。不要说在城市街区中没有骡马粪便可捡,即便到农村地区野外去,也捡不到这样特别的骡马粪便。因为这一堆粪中夹杂许多一、两寸长的草茎,它们明显是经铡切而成的饲草。饲草是在马厩里分发给骡马食用的,只有厩肥才会夹杂这些东西。野外行进中的骡马所排放的粪便不可能夹杂这种饲草。因此可以肯定,雷锋脚下的这一堆粪肥是从马厩里起出来的,而不是从野外捡来的。这张照片应该是由雷锋季增等人先从马厩里挖出粪肥堆成一堆,再从别处弄来几砣人粪放在上面做样子,然后摆姿势拍下来的。雷锋们弄虚作假糊弄大众,也太公然太放肆了点。照片中的那几砣“招牌”大粪也很可疑。虽然它们看上去的确像人粪,但并不像雷锋所说的那样属于“小孩”粪便。小孩没有那么大的肛门。现在不清楚雷锋们是从哪里搞来的这几砣大粪。不管是在营口还是在抚顺望花区,雷锋们要在驻地周围街区里找到几砣成年人遗弃的粪便决不是件简单的事。至少不是随时随地想捡立刻就能捡到的。我想他们未必愿意花大半天时间无目的地到处找。倒不如自己生产一点更便当些。因此,我们不能排除雷锋、季增等人自产自用道具大粪的可能性。

雷锋们这个假,造的也够龌龊的……