仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 535|回复: 16
打印 上一主题 下一主题

[学习教程] JAVA网站制作之JVM 有用参数-5 重生代渣滓接纳仓酷云

[复制链接]
萌萌妈妈 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:17:02 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
而学习JAVA我觉得最应该避免的就是:只学习,不思考,只记忆,不实践!本部分,我们将存眷堆(heap)中一个次要地区,重生代(younggeneration)。起首我们会会商为何调剂重生代的参数会对使用的功能云云主要,接着我们将进修重生代相干的JVM参数。
纯真从JVM的功效思索,其实不必要重生代,完整能够针对全部堆举行操纵。重生代存在的独一来由是优化渣滓接纳(GC)的功能。更详细说,把堆分别为重生代和老年月有2个优点:简化了新对象的分派(只在重生代分派内存),能够更无效的扫除不再必要的对象(即逝世对象)(重生代和老年月利用分歧的GC算法)
经由过程普遍研讨面向对象完成的使用,发明一个配合特性:良多对象的保存工夫都很短。同时研讨发明,重生对象很少援用保存工夫长的对象。分离这2个特性,很分明GC会频仍会见重生对象,比方在堆中一个独自的地区,称之为重生代。在重生代中,GC能够疾速标志接纳”逝世对象”,而不必要扫描全部Heap中的存活一段工夫的”老对象”。
SUN/Oracle的HotSpotJVM又把重生代进一步分别为3个地区:一个绝对年夜点的地区,称为”伊甸园区(Eden)”;两个绝对小点的地区称为”From幸存区(survivor)”和”To幸存区(survivor)”。依照划定,新对象会起首分派在Eden中(假如新对象过年夜,会间接分派在老年月中)。在GC中,Eden中的对象会被挪动到survivor中,直至对象满意必定的年事(界说为熬过GC的次数),会被挪动到老年月。
基于年夜多半重生对象城市在GC中被发出的假定。重生代的GC利用复制算法。在GC前To幸存区(survivor)坚持清空,对象保留在Eden和From幸存区(survivor)中,GC运转时,Eden中的幸存对象被复制到To幸存区(survivor)。针对From幸存区(survivor)中的幸存对象,会思索对象岁数,假如岁数没到达阀值(tenuringthreshold),对象会被复制到To幸存区(survivor)。假如到达阀值对象被复制到老年月。复制阶段完成后,Eden和From幸存区中只保留逝世对象,能够视为清空。假如在复制过程当中To幸存区被填满了,残剩的对象会被复制到老年月中。最初From幸存区和To幸存区会互换下名字,鄙人次GC时,To幸存区会成为From幸存区。

https://blog.codecentric.de/files/2011/08/young_gc.png
上图演示GC历程,黄色暗示逝世对象,绿色暗示残剩空间,白色暗示幸存对象
总结一下,对象一样平常出身在Eden区,年老代GC过程当中,对象在2个幸存区之间挪动,假如对象存活到得当的岁数,会被挪动到老年月。当对象在老年月出生时,就必要更初级其余GC,更分量级的GC算法(复制算法不合用于老年月,由于没有过剩的空间用于复制)
如今应当能了解为何重生代巨细十分主要了(译者,有别的一种说法:重生代巨细其实不主要,影响GC的要素次要是幸存对象的数目),假如重生代太小,会招致重生对象很快就提升到老年月中,在老年月中对象很难被接纳。假如重生代过年夜,会产生过量的复制历程。我们必要找到一个符合巨细,不幸的是,要想取得一个符合的巨细,只能经由过程不休的测试调优。这就必要JVM参数了
-XX:NewSizeand-XX:MaxNewSize
就像能够经由过程参数(-Xmsand-Xmx)指定堆巨细一样,能够经由过程参数指定重生代巨细。设置XX:MaxNewSize参数时,应当思索到重生代只是全部堆的一部分,重生代设置的越年夜,老年月地区就会削减。一样平常不同意重生代比老年月还年夜,由于要思索GC时最坏情形,一切对象都提升到老年月。(译者:会产生OOM毛病)-XX:MaxNewSize最年夜能够设置为-Xmx/2.
思索功能,一样平常会经由过程参数-XX:NewSize设置重生代初始巨细。假如晓得重生代初始分派的对象巨细(经由监控),如许设置会有匡助,能够节俭重生代主动扩大的损耗。
-XX:NewRatio
能够设置重生代和老年月的绝对巨细。这类体例的长处是重生代巨细会跟着全部堆巨细静态扩大。参数-XX:NewRatio设置老年月与重生代的比例。比方-XX:NewRatio=3指定老年月/重生代为3/1.老年月占堆巨细的3/4,重生代占1/4.
假如针对重生代,同时界说相对值和绝对值,相对值将起感化。上面例子:
$java-XX:NewSize=32m-XX:MaxNewSize=512m-XX:NewRatio=3MyApp
以上设置,JVM会实验为重生代分派四分之一的堆巨细,但不会小于32MB或年夜于521MB
在设置重生代巨细成绩上,利用相对值仍是绝对值,不存在通用原则。假如懂得使用的内存利用情形,设置流动巨细的堆和重生代更有益,固然也能够设置绝对值。假如对使用的内存利用一窍不通,准确的做法是不要设置任何参数,假如使用运转优秀。很好,我们不必做任何分外举措.假如碰到功能或OutOfMemoryErrors,在调优之前,起首必要举行一系列有目标的监控测试,减少成绩的本源。
-XX:SurvivorRatio
参数-XX:SurvivorRatio与-XX:NewRatio相似,感化于重生代外部地区。-XX:SurvivorRatio指定伊甸园区(Eden)与幸存区巨细比例.比方,-XX:SurvivorRatio=10暗示伊甸园区(Eden)是幸存区To巨细的10倍(也是幸存区From的10倍).以是,伊甸园区(Eden)占重生代巨细的10/12,幸存区From和幸存区To每一个占重生代的1/12.注重,两个幸存区永久是一样年夜的..
设定幸存区巨细有甚么感化?假定幸存区绝对伊甸园区(Eden)太小,响应重生对象的伊甸园区(Eden)永久很年夜空间,我们固然但愿,假如这些对象在GC时全体被接纳,伊甸园区(Eden)被清空,统统一般.但是,假如有一部分对象在GC中幸存上去,幸存区只要很少空间包容这些对象.了局年夜部分幸存对象在一次GC后,就会被转移到老年月,这并非我们但愿的.思索相反情形,假定幸存区绝对伊甸园区(Eden)太年夜,固然有充足的空间,包容GC后的幸存对象.可是太小的伊甸园区(Eden),意味着空间将越快耗尽,增添重生代GC次数,这是不成承受的。
总之,我们但愿最小化夭折对象提升到老年月的数目,同时也但愿最小化重生代GC的次数和延续工夫.我们必要找到针对以后使用的折衷计划,寻觅合适计划的出发点是懂得以后使用中对象的岁数散布情形。
-XX:+PrintTenuringDistribution
参数-XX:+PrintTenuringDistribution指定JVM在每次重生代GC时,输入幸存区中对象的岁数散布。比方:
Desiredsurvivorsize75497472bytes,newthreshold15(max15)
-age1:19321624bytes,19321624total
-age2:79376bytes,19401000total
-age3:2904256bytes,22305256total
第一行申明幸存区To巨细为75MB.也有关于老年月阀值(tenuringthreshold)的信息,老年月阀值,意义是对象重新生代挪动到老年月之前,经由几回GC(即,对象提升前的最年夜岁数).上例中,老年月阀值为15,最年夜也是15.
以后行暗示,关于小于老年月阀值的每个对象岁数,今年龄中对象所占字节(假如以后岁数没有对象,这一行会疏忽).上例中,一次GC后幸存对象约莫19MB,两次GC后幸存对象约莫79KB,三次GC后幸存对象约莫3MB.每行开头,显现直到今年龄全体对象巨细.以是,最初一行的total暗示幸存区To统共被占用22MB.幸存区To总巨细为75MB,以后老年月阀值为15,能够判定在本次GC中,没有对象会挪动到老年月。如今假定下一次GC输入为:
Desiredsurvivorsize75497472bytes,newthreshold2(max15)
-age1:68407384bytes,68407384total
-age2:12494576bytes,80901960total
-age3:79376bytes,80981336total
-age4:2904256bytes,83885592total
对照前一次老年月散布。分明的,岁数2和岁数3的对象还坚持在幸存区中,由于我们看到岁数3和4的对象巨细与前一次岁数2和3的不异。同时发明幸存区中,有一部分对象已被接纳,由于本次岁数2的对象巨细为12MB,而前一次岁数1的对象巨细为19MB。最初能够看到比来的GC中,有68MB新对象,从伊甸园区挪动到幸存区。
注重,本次GC幸存区占用总巨细84MB-年夜于75MB.了局,JVM把老年月阀值从15下降到2,鄙人次GC时,一部分对象会强迫分开幸存区,这些对象大概会被接纳(假如他们恰好出生)或挪动到老年月。
-XX:InitialTenuringThreshold,-XX:MaxTenuringThresholdand-XX:TargetSurvivorRatio
参数-XX:+PrintTenuringDistribution输入中的部分值能够经由过程别的参数把持。经由过程-XX:InitialTenuringThreshold和-XX:MaxTenuringThreshold能够设定老年月阀值的初始值和最年夜值。别的,能够经由过程参数-XX:TargetSurvivorRatio设定幸存区的方针利用率.比方,-XX:MaxTenuringThreshold=10-XX:TargetSurvivorRatio=90设定老年月阀值的下限为10,幸存区空间方针利用率为90%。
有多种体例,设置重生代举动,没有通用原则。我们必需分明以下2中情形:
1假如从岁数散布中发明,有良多对象的岁数延续增加,在抵达老年月阀值之前。这暗示-XX:MaxTenuringThreshold设置过年夜
2假如-XX:MaxTenuringThreshold的值年夜于1,可是良多对象岁数从未年夜于1.应当看下幸存区的方针利用率。假如幸存区利用率从未抵达,这暗示对象都被GC接纳,这恰是我们想要的。假如幸存区利用率常常到达,有些岁数凌驾1的对象被挪动到老年月中。这类情形,能够实验调剂幸存区巨细或方针利用率。

多谢指点,其实我对.net网页编程和ruby也不是很了解,对与java也只是刚起步的阶段,只是在学习中有了点想法就写出来了,现在俺本科还没毕业,所以对大型项目基本上也没有什么经验。
17#
发表于 2015-3-25 20:05:50 | 只看该作者
是一种将安全性(Security)列为第一优先考虑的语言
再现理想 该用户已被删除
16#
发表于 2015-3-18 11:43:22 | 只看该作者
是一种由美国SUN计算机公司(Sun Microsystems, Inc.)所研究而成的语言
小妖女 该用户已被删除
15#
发表于 2015-3-11 12:51:05 | 只看该作者
科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。
飘飘悠悠 该用户已被删除
14#
发表于 2015-3-11 06:47:27 | 只看该作者
Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。
分手快乐 该用户已被删除
13#
发表于 2015-3-8 14:34:37 | 只看该作者
[url]http://www.jdon.com/[/url]去下载,或到同济技术论坛的服务器[url]ftp://nro.shtdu.edu.cn[/url]去下,安装上有什么问题,可以到论坛上去提问。
蒙在股里 该用户已被删除
12#
发表于 2015-3-7 12:28:23 | 只看该作者
科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。
萌萌妈妈 该用户已被删除
11#
 楼主| 发表于 2015-3-4 01:51:05 | 只看该作者
Pet Store.(宠物店)是SUN公司为了演示其J2EE编程规范而推出的开放源码的程序,应该很具有权威性,想学J2EE和EJB的朋友不要 错过了。
冷月葬花魂 该用户已被删除
10#
发表于 2015-2-17 17:39:15 | 只看该作者
多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在 Java 1.5 版本中,Java 又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。
若相依 该用户已被删除
9#
发表于 2015-2-10 23:42:48 | 只看该作者
在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。
愤怒的大鸟 该用户已被删除
8#
发表于 2015-2-8 06:55:07 | 只看该作者
如果你学过HTML,那么事情要好办的多,如果没有,那你快去补一补HTML基础吧。其实JSP中的Java语法也不多,它更象一个脚本语言,有点象ASP。
admin 该用户已被删除
7#
发表于 2015-2-7 18:55:38 | 只看该作者
如果你学过HTML,那么事情要好办的多,如果没有,那你快去补一补HTML基础吧。其实JSP中的Java语法也不多,它更象一个脚本语言,有点象ASP。
爱飞 该用户已被删除
6#
发表于 2015-2-7 01:59:52 | 只看该作者
是一种使网页(Web Page)产生生动活泼画面的语言
小魔女 该用户已被删除
5#
发表于 2015-2-6 17:23:21 | 只看该作者
Sun公司看见Oak在互联网上应用的前景,于是改造了Oak,于1995年5月以Java的名称正式发布。Java伴随着互联网的迅猛发展而发展,逐渐成为重要的网络编程语言。
谁可相欹 该用户已被删除
地板
发表于 2015-2-2 06:07:52 | 只看该作者
Java是一个纯的面向对象的程序设计语言,它继承了 C++语言面向对象技术的核心。Java舍弃了C ++语言中容易引起错误的指针(以引用取代)、运算符重载(operator overloading)
金色的骷髅 该用户已被删除
板凳
发表于 2015-1-24 15:46:57 | 只看该作者
Jive的资料在很多网站上都有,大家可以找来研究一下。相信你读完代码后,会有脱胎换骨的感觉。遗憾的是Jive从2.5以后就不再无条件的开放源代码,同时有licence限制。不过幸好还有中国一流的Java程序员关注它,外国人不开源了,中国人就不能开源吗?这里向大家推荐一个汉化的Jive版本—J道。Jive(J道版)是由中国Java界大名 鼎鼎的banq在Jive 2.1版本基础上改编而成, 全中文,增加了一些实用功能,如贴图,用户头像和用户资料查询等,而且有一个开发团队在不断升级。你可以访问banq的网站
变相怪杰 该用户已被删除
沙发
发表于 2015-1-20 19:19:25 | 只看该作者
象、泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-9-20 21:24

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表