Java虚拟机的内存区域与内存溢出异常

最近在读讲Java虚拟机(深入理解Java虚拟机)的书,果然是另一片天地。

做了实验,现在总结一下Java VM的内存区域划分和内存的溢出异常。

内存区域划分

  • 程序计数器
  • 虚拟机栈
  • 本地方法栈
  • 方法区
    • 运行时常量池(方法区的一部分,用于存放各种字面量和符号引用)
  • 直接内存

空间分配

以32位Win为例,每个进程可以分到最多2G的内存,要分给Xmx(最大堆容量),还有MaxPermSize(最大方法区容量),计数器消耗很小,还有VM进程本身消耗的内存,剩下的内存就是VM栈和本地方法栈了。

内存溢出的异常

听说QQ有一Java面试题就是问你如何把Java虚拟机搞挂。好吧,其实很容易,其实挂掉也分好多的异常。

Java堆异常

看看下面这代码:

可以加一些VM的运行参数:

参数限定了VM运行的堆的大小为20M,当Out of memory时,会生成Heap的Dump文件 ,方便我们调试。我们可以用Eclipse Memory Analyzer分析。

死循环运行的结果可想而知,VM抛出了内存异常,像这样,

虚拟机栈和本地方法栈溢出

Java默认的Hotspot VM中不区分虚拟机栈和本地方法栈,我们可以用-Xss参数设定栈大小(-Xoss本来是设置本地方法栈的大小,但实际上无效)。这里可能有两种异常,

  • 如果栈深度大于VM所允许的最大深度,就抛StackOverflowError。
  • 如果VM扩展栈时无法申请足够的空间,就抛OutOfMemoryError。(但此异常在实际实验中,无法抛出。)

用函数递归就可以把VM搞挂了。

会抛出StackOverflowError的异常,

我们可以调整本地变量的数量和用-Xss调整栈空间,来看对stackLength的影响。

变量表越多,-Xss越小,stackLength越浅,反之越深。

运行时常量池溢出

使用Sting.intern向运行时常量池中加内容。因为运行时常量池是方法区的一部分,所以可以用-XX:PermSize和-XX:MaxPermSize限制方法区的大小,间接控制常量池的大小。

VM参数用-XX:PermSize=2M -XX:MaxPerSize=2M来限制方法区的最大容量,注意不能太小,不然VM是不能启动的。

出错信息如下:

PermGen是永久带(Permanent Generation)的意思,只在HotSpot里才有这个概念。

方法区溢出

让我们来把方法区搞挂,方法就是动态产生大量的类。

VM参数:-XX:PermSize=5M -XX:MaxPermSize=5M

执行,好吧,它挂了!

如大量产生JSP网页时,就有可能出现方法区溢出。

本机直接内存溢出

DirectMemory可以通过-XX: MaxDirectMemorySize来指定,如不指定,则默认与Java堆的最大值相同。通过Unsafe实例对内存进行直接分配(因为Unsafe被设计成只有rt.jar中的类才能使用,所以要用反射的方法强行改变它的访问权限)。

VM参数用-XX:MaxDirectMemorySize=10M (No space between XX: and M),程序就挂了。

NOTE:这段代码在Eclipse下面默认是不会编译通过的。要改一个默认选项。Preferences-〉Java-〉Compiler-〉Errors/Warnings-〉Deprecated and restricted API-〉Forbidden reference (access rules): 改成Warning

好了,现在能挂的都挂了! 😎

感受Web开发

最近一两个月一直在学习Web开发的相关技术,如HTML,CSS,JavaScript等技术,进度不是太快,总的感觉和这几年从事的传统桌面开发有很大的差别,有一些感触很大:

  • 不同的技术分工非常明确,层次非常清晰。HTML、CSS负责页面的结构和样式;JavaScript负责提供强大的灵活性;像Java这样的高级语言可以提供强大的框架,如Spring,支撑起整个应用。
  • 很多技术已经非常成熟。HTML 5, CSS 3已经渐渐成为业界的新标准,真得可以做出非常非常fashion的界面,JavaScript则有一些非常棒的Library,如jQuery,大大提高了生产力;后端支撑的Spring等库也非常成熟。整体来说,技术风险很小。

Team的优势,

  • 大部分人有丰富的传统的桌面经验,很多通用的思想已经准备好!
  • 老员工的学习能力很强,且愿意学习!

当然目前也有很多急需解决的问题,

  • Web的技术要学习!Team里只有老大一人对整个Web开发非常熟悉,大部分人都是半吊子,学习要一个过程,慢慢培养这方面的感觉。
  • 需要引入业界的最佳实践,打算到问问老同事和到论坛里发发帖子。

路漫漫,不知道有没有机会把这个项目完整的做完,尽力吧! 😎

使用JPDA进行Java程序的Debug

最近遇到一个很有趣的问题。程序在Eclipse开发状态下运行正常,但运行打包好的程序就有错误。然后我突然发现,竟不知道如何脱离Eclipse对一个Java程序做Debug,得找一个Java世界里的GDB。

其实是有的,那就是JPDA(Java Platform Debugger Architecture)–Java平台调试体系结构,IBM developerWorks上面有比较详细的介绍(请搜索“深入Java调试体系”),大概的结构也分几层,有Debuggee(被调试者),Debugger(调试者)等角色。

那如何进行调试呢?

还是举个小例子。有如下程序:

这是一死循环,不停的在打“Hello,World!”。

打包成一个test.jar, 然后用如下命令行启动。

好吧,你看到了一些JVM的参数。是的,加上-Xrunjdwp,JVM在启动test.jar时,会启动一个调试的Agent。后面具体参数的意思是:

启动之后,你会看到,

这是说Debuggee已经在准备Debugger的到来了。

Debugger连接

Debugger是谁?Eclipse是个不错的选择。如何建立连接?很容易,Let’s step by step.

  1. 选择Run->Debug Configurations…
  2. 选中“Remote Java Application”右击选择New。
  3. 然后填写Name,Host,Port,ConnectionType选择“Standard (Socket Attach)”。
  4. 点击“Debug”后,你会发现到不到源码,程序的执行也暂停了。
  5. 如果有源码的话,点击加载源码。
  6. 然后就可以加断点Debug了。

好了,这就完成了Java的程序的远程调试。当然没有源码也是可以调的,只是不那么直观。总之,很酷! 😛

老罗语录转载

用了两个晚上,看了老罗去年和今年的演讲,话说得很精彩,很有智慧,也很真实,做得事也厚道,人性,大气。我相信他老人家终有一天能成功。虽然不能千山万水的北上听他讲课,但可以他的机构一上市就买他家的股票。

网上搜了一些他的语录,转载于此。

1.这时候你发现了一个无比体贴的第三选项,大喊一声”啊!倪萍!”

2.如果倪萍考不过GRE,那只有一个可能就是她不背单词。

3.老罗:你那兜儿里有桃儿。

女生:呵呵,不好意思,这是留给我姥姥的……..

(我心想:谁***想吃了)

4.这个题巨简单无比以至于都不好意思做了。

5.瞪我干什么,我是从纯生物学角度来看待的,我们就是排斥同性恋,要是中国多些同性

恋,人口就不是问题了……当然,我是异性恋了。

6.你们真是气死我了……哎…求求你们了!

7.骠悍的人生不需要解释!

8.这是我一点不成熟的意见。

9.大家都是出来混的,都不容易!

10.人生总有几次踩到大便的时候。

11.直面惨淡的人生,正视淋漓的鲜血,彪焊的活下去!

12.以前上课时老师们都说女孩子要自立。哦,忘了,你们是考GRE的,考GRE的女生是什

么?猛女!

13.”老罗,这节课不要讲题了,咱们扯淡吧!”我听了差点没从讲台上栽下去。

14.”松软的肌肉和梨型的身材”……什么叫”梨形的身材”啊?咦,你们看我干什么?

我绝对不是梨形的身材,我是标准的水桶身材!

15.繁殖是指同种之间的。比如一只狗生了一窝小崽子,有胖的瘦的矮的丑的。不能说母

狗一看,咦……有一只猪,一只猫,一只鸭,还有条鱼!?

16.令人愉悦的忧伤……

17.就是这么彪悍!就是这么硬朗!

18.这个题目是在侮辱我们的智慧。

19.好了,笑话讲完了,刚才趴着的同学可以继续睡了。

20.从这个事情上,同学们又看到了你们罗老师的另外一个优点(或老派知识分子的高风

亮节)…….

21.日本是不是一个集体BT的民族?是!但是我从不骂他们BT,我要证明他们是如何BT。

22.没有袁隆平,中科院那帮废物吃什么啊?

23.要是让我遇见,我就废了他!

24…….对不起,我有点激动啊。

25.我是一个九流诗人,我和她(Emily Dickinson)拼不过才气。那我拼什么,拼人品,

她们拼不过我。

26.这就是十三岁的少年罗永浩第一次近距离目击活生生的黑人!

27.如果几年以后你来新东方看到一个人,咦,面熟,就是想不起来是谁,好像是罗永浩

的弟弟,注意,我没有弟弟!

28.一个家里有一个男孩儿一个女孩儿一点事情都没有,有两个女孩儿平时鸡毛蒜皮的小

事也无所谓,但是如果有两个男孩,尤其是在民风相对彪悍的东北……

29.我爸一边给人家赔药费,一边心里窃喜:***,这才是我儿子!!!

30.有些同学可能怀疑我的人品,我再给你们讲一个故事:”我们家原来有一棵樱桃树..

….你们都笑!你们笑我就不讲了”

31.”ETS本来就是病态的出题,我门也就要用不正常的思路做题了。”

32.”GRE是什么,就是让中国人体验美国人愚蠢程度的考试”

33.这道题,自从老罗出现以后,就解决了。老教师对我说:老罗,你真***牛啊!

我说:快别这么说了,我只不过是站在巨人的肩膀上。

34.像我这样的奇男子……

35.我们今年的春节联欢会的主题就是突出”联欢”两个字————这就是倪大姐的逻辑

36.你说说你的思维都混乱到什么程度了。

37.这道题是新东方有史以来最有争议的题,但是罗老师的到来……我只是站在了巨人的

肩上。

38.顺着倪大姐的思路,这道题应该选什么?

39.左倾右倾不重要,重要的是被打倒!

40.一说谎话就出汗了哈……

41.我咽下一口苦水,她还以为是咽口水。

42.拉斯维加斯离婚也方便,大家都开着车排队去离婚,以至于你慢一点儿后面的人都不

愿意:”快点快点!还让不让人离婚了?!”老俞去了之后两眼直放光:”太方便了!太方便了!”。

43.我觉得你们感情没破裂……(男的给女的一巴掌,女的踹男的一脚以后)啊?真的破

裂了…

44.穿喇叭裤就是流氓了?简直就是逻辑混乱!!!

45.老罗:这句话对不对?对不对?对吗?不对吗?

我们:……不对……

老罗:你告诉我哪不对了?这简直就是没有再对的了!无聊的题,下一道!

46.One by one的care不过来。

47.你们看这个词——gullibility…gullibility…读着像什么?不就是傻了吧几吗!

48.不由得你不佩服!

49.在美国的研究生院里中国学生从来不参加课堂讨论,以至于教授都以为他们什么都不

会。可是一考试就是第一一考试就是第一,那美国教授不就崩溃了吗?他根本理解不了,

于是感叹道”啊,神秘的东方!”

50.像我这种牛人,想找个人佩服一下的时候我就去照镜子。

51.他跟你要八块你转身就走,这时候他一般就会说”五块怎么样”,你一看差不多也就

成交了。有一回下课的时候,一个学生特兴奋地跑到前面跟我说”老罗,我砍到了三块八

!”。我心想,太无耻了!盗版小犯也是人啊!

52.你们知道老俞怎么讲填空吗?老俞以前教课的时候经常是”A,B直接排除;D,E一看

必然就是错的,所以这道题选C”。那有的学生就问了”我怎么就看不出来D,E错得那么必

然呢?”。这时候,老俞就会放下书,走到讲台前,给大家讲一段人生立志的小故事,53.”就快考到了!”

54.英语教育界像这种老骗子我见的多了。

1.老罗在课上问∶“日本女人有什么爱好?”

下面有人回答∶“拍片!!”

老罗暗笑,说∶“你们T M D就不能想点好的东西啊~那么,日本男人有什么爱好?”下面异口同声∶“看片!!!”

3.古代诗人去妓院是去谈恋爱的。

8.背过词典的我只见过老俞和那个广东疯子。

10.什么是梨型的身材?恩?你们看我干什么??我老罗是标准的桶型身材!!

12.这道题多年来在新东方一直讲不明白,直到你们罗老师加盟了新东方。老教师都对我说∶老罗,你可真牛!我赶紧说∶快别这么说,我只是站在了巨人的肩膀上!

14.我外婆出生于光绪年间,改个屁嫁。

16.当学生向老俞提问时,老俞会给他讲个他自己奋斗的小故事,把学生都感动坏了,就忘了刚才的问题了。

19.中国要是有50%的人都是同性恋,人口问题就解决了。

20.为什么?很简单,因为你是土鳖,没见过世面。

21.13岁的少年罗永浩,有生以来第一次近距离目击活的黑人!

23.这时我赶紧掏出记事本,写遗嘱。

31.令人愉悦的忧伤

32.我真嫉妒你们能遇到这么牛的老师!

33.真正的猛男,敢于直视惨淡的人生。

34.猛男的另一个特征,哭的时候要躲起来。

37.幸福的直哆嗦。

38.啊,该睡觉了,喝两杯咖啡。

43.听完精神崩溃了。

44.中国教育的两大悲哀∶

45.女生就这点不好,你吵不过可以打嘛,打不过可以不打嘛!干什么去打小报告呢?

48.我到新东方后劝退了不少老教师。

50.镖悍的人生不需要解释。

52.我咽了一口苦水,不过在她看来是一口口水。

53.风。冷风。冷风吹。————–古龙这样写是为了赚稿费(按行计费)

55.眼睛血丝密布,脑门上青筋暴露,脚上出现了汗毛。

57.——-老罗呢?——-不知道,也别问,反正是没了。

62.注意,老罗从来就没有弟弟!

63.有时候,我也稍微感到一点点恶心。

66.老子一天不做上1000个俯卧撑还真***不爽!

67.小孩打架是比发育。

68.过了3年,我发育了!!!

73.我跟他们比人品!!

76. 你数学不好,还可以去当英国首相嘛(邱及耳),不行也可以去当****作家嘛(李敖),还可以去英国做诗嘛(徐只摸),当然以上的都需要签证。那不行你可以在国内当作家嘛(钱钟书),最次你也可以当个老师嘛(罗永浩),如果你连课都讲不了,你也可以去当个校长 吧(俞敏洪)。

78.不能这样,否则他们会认为你很活泼。

79.你们都看不看中 央电视台的春节晚会啊?啊,怎么还保持着这个恶习啊?! 中

央电视台的联欢晚会不是给正常人看的.但是爸妈要看, 作儿子的总不能回屋吧,先吃几个维生素B6(孕妇用来防止呕吐的),再硬着头皮坐在电视机前.

有一年竟然发生这样的事: 倪萍满面假春风地说:”今天的联欢会突出了联欢的主题.”对得让人面红耳赤! 思路与ETS高度一致!她去考GRE如果不得2400, 那基本是词汇不过关!

80.痴呆型精神病患者最幸福。已经达到一个高深的境界,每天都处于非常high的状态。而且干啥随便∶你是傻子你怕什么!?可以被养得白白胖胖,永远处于放风状态。

81.政治就是没有矛盾,制造矛盾;再解决矛盾。其实就是制造仇恨的。巴勒斯坦的小学数学课本里有道题∶抓到七个以色列战俘,干掉五个,还剩几个?连数学都灌输仇恨的民族是没有希望的。

82.遇到误会解不解释呢?绝不解释!只有两种情况我才解释∶1亲人误会我。如果我不解释,他们会难过。2法院误会我。除了这两种,绝不解释。真正硬朗彪悍,不解释!妈的,连我这种人你都误会,你还能干啥?

83.Caculus 一看我就头发麻。听说马克思当年写资本论时累了就做两道微积分休息休息。当年我就因此埋下了对马克思的深仇大恨。但后来经证实是算术题不是微积分。原来是算术题啊,嘿嘿。我是中国大陆唯一考gre不答数学部分的人。当年我答到数学section的时候,第 一题我花了7分钟读题,咦?没读懂。他妈的不做了。按下一题。没想到机器提示我必须选一个答案。我当时汗就下来。我来考试是想得到自己的真实成绩啊。它这蒙错了还好,蒙对了怎么办啊!ETS怎么也没想到,还有这样的奇男子,蒙对了会很伤心的。我一想,都不 做了。于是把整个数学section全放掉。直接做下面的section。考了几次GRE全没答数学 section。后来ETS给我寄成绩时问我∶By the way,能问问你为什么每次都不答数学部分呢?你有什么目的么?嘿嘿,我不告诉你。我给 ETS写信∶如果你给我退数学部分的考试费我就告诉你。他们没理我,于是我也就没理他们。

84.杀虫剂是干什么的啊?就是帮助昆虫搞优生学的。越来越好的杀虫剂把一个个小虫子搞得象小泰森似的。遇到不怎么样的杀虫剂就象下场毛毛雨,好点呢,就是洗个澡.而且这些小虫子洗澡时也不闲着,一边洗一边唱∶“我们是害虫,我们是害虫!”

85. 我家离新东方远,每天在家门口打车。家太偏僻了,到处是比夏利还破的车。根本不愿意坐。有一天我发现了一个黑色桑塔那—在我们那算是高档车拉。可我一看那司机就不想坐了。他又黑又瘦,干瘪小个,一副欠扁的窝囊相。不得以为了车还是坐上去了。坐上去后才发现这司机不一般啊。上了车他立即象个男子汉了– –一个劲踩油门,只分轻踩和重踩,根本不见踩刹车。我惊喜地发现“北京不堵车拉!”不论红灯绿灯一路过,别的车都让路。充满了罪恶的快感。太爽拉。那干瘪身形高大起来.但是一下车,他的眼神又变的窝囊起来了。

86.人最他妈虚伪。你去跳崖自杀,看见了一个人你看他就来气,上去就扁了一顿,然后心情就爽了,不想死了,抱住人家大叫“恩人!”,结果他跳下去了。对动物也一样∶把人类折磨的对象叫恩人。什么救命恩狗的。比如小蜜蜂。人家一年辛辛苦苦酿蜜。是给你酿的 ?!你上去抢过来咕咚咚喝完,一抹嘴,说∶“啊,小蜜蜂,你真是辛勤的小精灵啊!”靠,你欺负也就欺负了,还要恶心它。它是不知道。如果知道了,肯定气吐血。

87.家里穷那会儿,屋里坐四个人,只有一袋半方便面。还没吃呢,又来一个人。我们四个这个后悔啊—-怎么不早吃呢?那人兴高采烈地说今天感恩节啊!他妈的,吃的都没有,感什么恩?!他说我们去教堂吧!我们又不信教上什么教堂?他说哎呀感恩节,教堂有吃的。我们一听乐疯了。于是五个人骑着三辆自行车直奔教堂。到那一看果真有糖果饼干什么的,而且随便进。我 们就上去疯吃一顿。没人管啊。于是留下了美好的回忆。第二年感恩节,我们又去了,一看是自助餐!!!都精神崩溃了。上去疯狗一样吃。

88.最土最庸俗最家常便饭的就是孔子。所以得到广泛流传。象老子庄子那都太酷拉。从远处骑个小毛驴戴个墨镜。走过你身边。然后消失在远方,可是你还觉得那墨镜在他背后。巨酷无比。语言所不能表达的就是禅,最酷。不能渐悟,只能顿悟。师傅拿个棍子。你问

∶“什么是禅啊,我怎么还没悟到啊?”师傅上去就一棍子打在头上∶接着悟!当时有多少徒弟被打傻打死啊。有的徒弟聪明,被打了一下,就“啊,我懂了!”于是下山收徒弟,手里也拿个棍儿,徒弟说悟不出,上去就打∶接着悟!聪明的徒弟怎么样啊?也不用接着悟, 也不用挨打,直接拿个棍就下山收徒弟。办起住宿班、冲刺班、12周班、15周班……….

89.我们不幸和财狼作了邻居(指日本)。小日本们从古至今要么正在侵略要么在筹备侵略。在他那小破倒霉土地上,并且不计划生育,这不找死么!?日本人从小就被洗脑∶ 缺乏资源出去抢是正确的。日本单个人都挺好的。放到一起就是一个人格分裂精神变态的民族。我也遇到过几个不错的日本人。但我绝不与他们深交。为什么啊。我深谋远虑啊。到时上了战场,老子二话不说一枪废了他!有的同学听了我的课去投诉,说我在课上宣扬反日情 绪。这是反日情绪么?现在我来纠正一下啊。不是反日情绪。是仇日情绪!记住了啊。到时候投诉别说错了!

90.当年我上住宿班的时候老俞还不象现在这么忙。上山给每期学员作一次动员演讲。那时老俞在我们心中就是神啊。一天听说晚上老俞来作演讲。于是都早早跑到演讲处集合。老俞吃过饭来了,拿起话筒,什么都没说呢,就是一个响亮的饱嗝。要多不合时宜有多不合时 宜。我们当时听了都傻了,互相看了看,脸上都洋溢着痴呆幸福的光芒说∶多么平易近人的饱嗝啊!!!!

91.Ezra Pound 是美国20世纪文学界的******。在美国写诗得不到认可,就去英国混。在英国混出头了。然后肆无忌惮。大骂美国,还写道∶资本主义排斥诗人。美国是资本主义,英国不是么?!头脑极度混乱,诗人的标志。后来E.P开始研究政治。一个诗人研究什么政治?!而且他 居然拥护墨索里尼,参与了一个反美电台。他酷爱中国文化,对中国文化病态痴迷。把孔子的着作都翻译成英文。狂迷中国饮食,在整个意大利没找到中餐馆,于是大怒∶居然没有中餐馆,这个国家完蛋了!

92.把有限的马屁集中火力拍到一个人的屁股上。

93.愚蠢本能发作了

94.雷锋一生扶过六千个老太太过马路

97.我走来走去,为中国的命运苦苦思索

98.在一个疯子的领导下,一国人都疯了。政治比战争可怕得多。

100.破题,肯定是倪萍参与了出题。

101.每个学校都有一个变态的中年妇女当教导主任.

102.每个学校都有一个好色的男体育老师一上课就让男生玩球,自己领女生做游戏。

关于如何用C++实现一个不可以被继承的类

很早以前在某个笔试题集里看到了这个题目,MS是Adobe公司出的。当时第一反应要用到什么私用化构造函数,友元之类的技术,但后来实现的时候却发现更多的问题,现在已经一一搞明白了。今天记在这,总结一下。

主要的代码:

几个要点:

  1. 在NoDeriveBase这个类里是不能直接写,friend class T的,编译器(gcc)会报错。所以要用Type2Type的技术,Loki库里常用的技术。
  2. 为什么A要虚继承自NoDeriveBase?原因是A虚继承后,B再继承A时,B要直接访问虚基类的构造函数,而不是直接通过A的构造再访问NoDeriveBase的构造。所以,如果不虚继承的话,B是可以继承A的。
  3. 这段代码会编译出错。B是不可以继承A的。

终于都明白了! 🙂