欢迎来到天天文库
浏览记录
ID:32984082
大小:77.44 KB
页数:7页
时间:2019-02-18
《探究内存泄露—part1—编写泄露代码-java开发java经验技巧》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、探究内存泄鉤一Paul—编写泄露代码-Java开发Java经验技巧探究内存泄M-Part1—编写泄露代码木文由ImportNew・黄索远翻译自captaindebug0欢迎加入翻译小组。转载请见文末要求。几天前我发现了一个小问题:有一个服务器在跑了一段吋间后挂掉了。重启脚本和系统后,这个问题还是会出现。因为问题代码不是关键业务,所以尽管有大量的数据丢失,但是问题并不严重。不过我述是决定作进一步的调查,来探寻一下问题到底出现在哪。首先注意到的是,服务器通过了所有的单元测试和集成环境的完整测试。在测试环境下使用测试数据吋运行得非常正常。那么为什么在工作环境中一跑起來就会出现问题呢?很容易就能想到
2、,也许是因为在实际运行时的负载大于测试,甚至超过了设计时所能承载的负重,从而耗尽了资源。但是到底是什么资源,又是在哪里耗尽的呢?这就是本文需要探究的难题。为了演示如何调查这个问题,第一件事情就是写一些内存泄露的代码。我将会釆用生产者一消费者模型,以便更好的说明这个问题。和往常一样,为了说明内存泄露代码,我需要人为建立一个场景。在这个场景中,假定你为一个证券经纪公司工作,这个公司将股票的销售额和股份记录在一个数据库中。通过一个简单进程获取命令并将其存放在一个队列屮。另一个进程从该队列中读取命令并将其写入数据库。命令的POJO(简单Java对彖)非常的直观:publicclassOrder{pr
3、ivatcfinalintid;privatefinalStringcode;privatefinalintamount;privatefinaldoubleprice;privatefinallongtime;privatcfinalIong[]padding;/***©paramid*The*@paramcode*The*©paramamount*theorderidstockcodenumberofshares*@paramprice*thepriceoftheshare*©paramtime*thetransactiontime*/publicOrder(intid,Stringco
4、de,intamount,doubleprice,longtime){super();this,id二id;this.code二code;this,amount二amount;this,price=price;this,time=time;//ThisjustmakestheOrderobjectbiggersothat//theexamplerunsoutofheapmorequickly,this.padding二newIong[3000];Arrays,fill(padding,0,padding,length-1,-2);}publicintgetTd(){rcturnid;}pub
5、licStringgetCode(){returncode;}publicintgetAmount(){returnamount;}publicdoublegetPrice(){returnprice;}publiclonggctTimc(){returntime;}}这个命令POJO是Spring应用的一部分。这个应用有三个主要的抽象类,当应用调用他们的start()方法时分别创建一个新进程。第一个抽象类是OrderFeedorun()方法会生成一个虚拟的命令并将其放置在队列中。生成命令后它会睡眠一会儿,然后生成一个新的命令。publicclassOrderFeedimplementsRu
6、nnable{privatcstaticRandomrand=newRandom();privatestaticintid=0;privatefinalBlockingQueue<0rder>orderQueue;publicOrderFeed(BlockingQueueorderQueue){this.orderQueue=orderQueue;}/***CalledbySpringafterloadingthecontext・Startproducingorders*/publicvoidstart(){Threadthread=newThread(this,"Orderp
7、roducer");thread,start();}/**Themainrunloop*/©Overridepublicvoidrun(){while(true){Orderorder=createOrder();orderQueue.add(order);sleep();}}privateOrdercreateOrder(){finalString:]stocks={〃BLND.L〃,〃DGE・L〃,〃MK
此文档下载收益归作者所有