欢迎来到天天文库
浏览记录
ID:30778025
大小:210.20 KB
页数:19页
时间:2019-01-03
《java中简化堆外内存结构、元组-java开发java经验技巧》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、Java中简化堆外内存结构、元组-编程开发技术Java中简化堆外内存结构、元组木文由ImportNew・norwind翻译自javacodegeekso欢迎加入翻译小组。转载请见文末要求。在上一篇文件章中,我详细描述了内存访问模式的重要性。从那时起,我就在考虑在Java屮怎样做才能更好的预测内存的使用情况。冇一些使用数组结构的模式可以使用,我将在另一篇文章中讨论。这篇文章将探讨怎样模拟一个Java中严重缺失的特性一一类似于C语言屮的结构数组。结构是非常有用的,无论在栈还是在堆。据我所知,九腹栈的特
2、性是无法模拟的。这样极大地限制了一些并行算法的性能,这一点以后再说。在Java所冇的用户自定义类型必须存在丁•堆中。在一般情况下,Java堆是由垃圾冋收器管理,但是Java程序中还存在更广泛的堆。通过引入直接的ByteBuffer,内存可以不被垃圾收集器跟踪,因为它可以使木地代码在与内核10交互时避免对数据重复性操作。因此,管理结构时假装它们在ByteBuffer内是一种合理的方法。这可以简化数据表示,但有性能和规模的限制。例如,ByteBuffer不能大于2GB,所有的访问都要进行边界检查,这将
3、影响性能。另一个可供选择的方法是使用Unsafe类,速度更快,并且不像ByteBuffer那样有大小限制。我将要详述的不是传统的方法。如果你要处理人规模数据,或者对性能要求很高,那请你接着往卜•看。如杲你的数据集较小,性能不是问题,那么现在跑开,以免陷入本地内存管理的黑魔法屮。使用该方法具体的好处是:1.显著提高性能2.更简化的数据表示3.非常强的大数据集工作能力,同时避免讨厌的GCpauses.[1]使用这些方法也要承担一些后果。使用下而捉到的方法时需要你自己进行一部分内存管理工作。如果出现问题
4、可能导致内存泄露,更严重的会导致JVM崩溃!请谨慎行事…合适的例子-贸易数据金融应用程序而临的一个共同挑战是需要获取和处理大量的订单及贸易数据。对于这个例子,我会根据内存中的贸易数据创建一张大表,并可以针对它运行分析查询。这张表将使用两种对比性很强的方法创建。第一种,我将使用Java',1的传统方法,创建一个大的数组,数组中的每个元素是一个Trade对象的引用。第二种,我将使用相同的代码,但是把大数组和Trade对象换成堆外数组结构,使得可以通过-个享元(Flyweight)模式处理。如果在传统方
5、法我使用了其它的数据结构,如Map或Tree,那么内存占用会更大,性能会更低。传统的Java方法:publicclassTestJavaMemoryLayout{privatestaticfinalintNUM_RECORDS二50*1000*1000;privatestaticJavaMemoryTrade[]trades;publicstaticvoidmain(finalString[]args){for(inti=0;i<5;i++){System・gc();perfRun(i);}}pr
6、ivatestaticvoidperfRun(finalintrunNum){longstart=System.currentTimeMi11is();init();System,out.format('Memory%,dtotal,%,dfree,Runtime.^etRuntime().totalMemory(),Runtime.gctRuntimc()•frccMcmory());longbuyCost=0;longsellCost二0;for(inti=0;i7、++){finalJavaMemoryTradetrade=get(i);if(trade.getSideO=='B')buyCost+二(trade.getPrice()*trade.getQuantity());elseseiICost+二(trade.getPriceO*trade.getQuantity());longduration二System,currentTimeM订lis()-start;System,out•printIn(runNum+'-duration'+duration8、+’ms');System,out.println(,buyCost二,+buyCost+,sellCost二,+sellCost);}privatestaticJavaMemoryTradeget(firmlintindex){returntrades[indcx];}publicstaticvoidinit(){trades=newJavaMemoryTrade[?
7、++){finalJavaMemoryTradetrade=get(i);if(trade.getSideO=='B')buyCost+二(trade.getPrice()*trade.getQuantity());elseseiICost+二(trade.getPriceO*trade.getQuantity());longduration二System,currentTimeM订lis()-start;System,out•printIn(runNum+'-duration'+duration
8、+’ms');System,out.println(,buyCost二,+buyCost+,sellCost二,+sellCost);}privatestaticJavaMemoryTradeget(firmlintindex){returntrades[indcx];}publicstaticvoidinit(){trades=newJavaMemoryTrade[?
此文档下载收益归作者所有