再见西城 发表于 2015-1-18 11:15:56

JAVA教程之Java堆外内存的利用仓酷云

你说是sun公司对她研究的透还是微软?针对自己工具开发的.net网页编程性能上肯定会站上风的。比来常常有人问我在Java中利用堆外(offheap)内存的优点与用处安在。我想其他面对几样选择的人应当也会对这个谜底感乐趣吧。
堆外内存实在并没有出格的地方。线程栈,使用程序代码,NIO缓存用的都是堆外内存。现实上在C大概C++中,你只能利用未托管内存,由于它们默许是没有托管堆(managedheap)的。在Java中利用托管内存大概“堆”内存是这门言语的一个特征。注重:Java并不是独一这么做的言语。
newObject()vs对象池vs堆外内存

newObject()

在Java5.0之前,对象池一度十分盛行。谁人时分创立对象的开支长短常高贵的。但是,从Java5.0今后,对象创立及渣滓接纳已变得十分便宜了,开辟职员发明功能失掉了提拔后,便简化了代码,放弃了对象池,必要的时分就往创立新的对象就行了。在Java5.0之前,几近一切对象,包含对象池自己,都经由过程对象池来提拔功能,而在5.0今后,只要那些出格高贵的对象才有需要池化了,例如说线程,Socket,和数据库毗连。
对象池

在低时延范畴它还是有必定的用武的地方的,因为可变对象的轮回利用加重了CPU缓存的压力,进而使得功能失掉了提拔。这些对象的性命周期和布局都必需尽量复杂,但这么做以后你会发明体系功能及发抖城市失掉年夜幅度的改良。
另有一个范畴也对照合适利用对象池,比如必要加载海量数据且个中包括很多冗余对象时。利用对象池能明显削减内存的利用量和必要GC的对象数,进而换来更短的GC工夫和更高的吞吐量。
这类对象池一般城市计划得对照轻量级,而非复杂地利用一个同步的HashMap,因而它们还是有存在的代价的。
拿StringInterner类来作一个例子。你能够将一个包括你想要的文本的可反复利用的可变StringBuilder作为参数传给它,它会前往你一个婚配的字符串。间接传送String对象的效力会很低,由于你已把这个对象创立出来了。StringBuilder则是能够反复利用的。
注重:这个布局有一个很成心思的特征就是它不必要分外的线程平安的机制,例如说volatile大概synchronized,仅需Java所保证的最低限制的线程平安就充足了。你能准确地会见到String外部的final字段,顶多就是读到了纷歧致的援用罢了。

publicclassStringInterner{privatefinalString[]interner;privatefinalintmask;publicStringInterner(intcapacity){intn=Maths.nextPower2(capacity,128);interner=newString;mask=n-1;}privatestaticbooleanisEqual(@NullableCharSequences,@NotNullCharSequencecs){if(s==null)returnfalse;if(s.length()!=cs.length())returnfalse;for(inti=0;i<cs.length();i++)if(s.charAt(i)!=cs.charAt(i))returnfalse;returntrue;}@NotNullpublicStringintern(@NotNullCharSequencecs){longhash=0;for(inti=0;i<cs.length();i++)hash=57*hash+cs.charAt(i);inth=(int)Maths.hash(hash)&mask;Strings=interner;if(isEqual(s,cs))returns;Strings2=cs.toString();returninterner=s2;}}
堆外内存的利用

利用堆外内存与对象池都能削减GC的停息工夫,这是它们独一的配合点。性命周期短的可变对象,创立开支年夜,大概性命周期虽长但存在冗余的可变对象都对照合适利用对象池。性命周期适中,大概庞大的对象则对照合适由GC来举行处置。但是,中永生命周期的可变对象就对照辣手了,堆外内存则恰是它们的菜。
堆外内存的优点是:

[*]能够扩大至更年夜的内存空间。好比凌驾1TB乃至比主存还年夜的空间。
[*]实际上能削减GC停息工夫。
[*]能够在历程间共享,削减JVM间的对象复制,使得JVM的支解部署更简单完成。
[*]它的耐久化存储能够撑持疾速重启,同时还可以在测试情况中重现临盆数据。
站在体系计划的角度来看,利用堆外内存能够为你的计划供应更多大概。最主要的提拔其实不在于功能,而是决意性的。
堆外内存及测试

高功能盘算范畴最年夜的一个难点在于重现那些潜伏的BUG,并证明成绩已失掉修复。经由过程将输出事务及数据以耐久化的情势存储到堆外内存中,你能够将你的关头体系酿成一系列的庞大形态机。(复杂的情形下只要一个形态机)。如许的话在测试情况便可以复现出身产情况呈现的举动及功能成绩了。
很多投行都经由过程这项手艺来牢靠地重现当天体系对某个事务的呼应,并剖析出该事务之以是这么处置的缘故原由。更加主要的是,你可以当即证实线上的妨碍已失掉懂得决,而不是发明一个成绩后,寄但愿于它就是激发线上妨碍的本源。断定性的举动还陪伴着断定性的功能。
你能够在测试情况中依照实在的工夫往返放事务,由此失掉的时延散布也一定是临盆情况中所呈现的。因为硬件的分歧,一些体系的发抖大概难以复现,不外这在数据剖析的角度而言已相称靠近实在的情形了。为了不呈现花一成天的工夫往返话前一天的数据的情形,你还能够增添一个阈值,例如说,假如两个事务的距离凌驾10ms的话你能够就只守候10ms。如许你可以在一个小时内依据实践的工夫往返放出一天的事务,来反省下你的修改是不是对时延散布有所改良。
如许做是不是就丧失了“一次编译,到处实行”的优点了?

必定水平下去讲是如许的,但实在的影响比你想像的要小很多。越靠近处置器,你就更依附于处置器大概操纵体系的举动。所幸的是,尽年夜多半体系利用的都是AMD/Intel的CPU,乃至是ARM处置器在底层上也愈来愈与这两家兼容了。操纵体系之间也存在不同,因而相对Windows而言,这项手艺更合适在Linux体系上利用。假如你是在MacOSX大概Windows上开辟,然后临盆情况是部署在Linux上的话,就一点成绩都没有了。我们在HigherFrequencyTrading中也是这么做的。
利用堆外内存会引进甚么新的成绩

世界没有收费的午饭,堆外内存也不破例。最年夜的成绩在于你的数据布局变得有些别扭。要末就是必要一个复杂的数据布局以便于间接映照到堆外内存,要末就利用庞大的数据布局并序列化及反序列化到内存中。很分明利用序列化的话会对照头疼且存在功能瓶颈。利用序列化比利用堆对象的功能还差。
在金融范畴,很多高频次的数据都是扁平的复杂布局,全体由基本范例构成,十分合适映照到堆外内存。但是,并不是一切的使用程序都是如许的,大概会有一些嵌套得很深的数据布局,好比说图,你还不能不将这些对象缓存在堆上。
别的一个成绩就是JVM会制约到你对操纵体系的利用。你不必再忧虑JVM会给体系形成太重的负载。利用堆外内存后,某些限定已不复存在了,你可使用比主存还年夜的数据布局,不外假如你这么做的话又得思索一下利用的是甚么磁盘子体系了。好比说,你一定不会但愿分页到一块只要80IOPS(Input/OuputOperationsperSecond,每秒的IO操纵)的HDD硬盘上,最好是IOPS能到80,000的SSD硬盘,固然了,1000x的话更好。
OpenHFT能做些甚么?

OpenHFT包括很多类库,它们向你屏障了利用当地内存来存储数据的细节。这些数据布局都是耐久化的,利用它们不会发生渣滓大概只要很少。利用了它的使用程序能够运转一成天也没有一次MinorGC.
ChronicleQueue——耐久化的事务行列。撑持统一台呆板上多个JVM的并发写,和多台呆板间的并发读。微秒级的提早,并能延续坚持每秒上百万动静的吞吐量。
ChronicleMap——kv表的当地或耐久化存储。它能在统一台呆板的分歧JVM间共享,数据是经由过程UDP大概TCP来复制的,并经由过程TCP来举行远程会见。微秒级的提早,单台呆板能坚持每秒百万级的读写操纵。
ThreadAffinity——将关头线程绑定到自力的CPU核大概逻辑CPU上,以削减体系发抖。发抖能够减小到本来的千分之一。
利用哪一个API?

假如你必要纪录每一个事务的话——>ChronicleQueue
假如你只必要某个独一主键比来的一条了局——>ChronicleMap
假如你更体贴那20微秒的发抖的话——>ThreadAffinity

一旦你有了思想,那你编的程序就有了灵魂,不管是什么语言到了你的手里都会是你的工具而已,他们的价值是能尽快帮助你实现你想要的目标。但是如果你没有了思想,那就像是海里的帆船失去了船帆,是很难到打海的另一边的。

小魔女 发表于 2015-1-20 18:50:14

Jive的资料在很多网站上都有,大家可以找来研究一下。相信你读完代码后,会有脱胎换骨的感觉。遗憾的是Jive从2.5以后就不再无条件的开放源代码,同时有licence限制。不过幸好还有中国一流的Java程序员关注它,外国人不开源了,中国人就不能开源吗?这里向大家推荐一个汉化的Jive版本—J道。Jive(J道版)是由中国Java界大名 鼎鼎的banq在Jive 2.1版本基础上改编而成, 全中文,增加了一些实用功能,如贴图,用户头像和用户资料查询等,而且有一个开发团队在不断升级。你可以访问banq的网站

透明 发表于 2015-1-29 14:53:44

Java 编程语言的风格十分接近C、C++语言。

因胸联盟 发表于 2015-2-4 00:06:46

我大二,Java也只学了一年,觉得还是看thinking in java好,有能力的话看英文原版(中文版翻的不怎么好),还能提高英文文档阅读能力。

再现理想 发表于 2015-2-9 07:54:37

应用在电视机、电话、闹钟、烤面包机等家用电器的控制和通信。由于这些智能化家电的市场需求没有预期的高,Sun公司放弃了该项计划。随着1990年代互联网的发展

冷月葬花魂 发表于 2015-2-26 08:03:50

接着就是EJB了,EJB就是Enterprise JavaBean, 看名字好象它是Javabean,可是它和Javabean还是有区别的。它是一个体系结构,你可以搭建更安全、更稳定的企业应用。它的大量代码已由中间件(也就是我们常听到的 Weblogic,Websphere这些J2EE服务器)完成了,所以我们要做的程序代码量很少,大部分工作都在设计和配置中间件上。

飘飘悠悠 发表于 2015-3-8 12:55:45

在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。

精灵巫婆 发表于 2015-3-15 22:58:27

是一种使网页(Web Page)由静态(Static)转变为动态(Dynamic)的语言

灵魂腐蚀 发表于 2015-3-22 17:37:16

是一种使用者不需花费很多时间学习的语言
页: [1]
查看完整版本: JAVA教程之Java堆外内存的利用仓酷云