在本系列教程中,将带大家动手探究Java内存泄露之谜,并教授给读者相关的分析方法。以下是一个案例。
最近有一个服务器,经常运行的时候就出现过载宕机的现象。重启脚本和系统后,该个问题还是会出现。尽管有大量的数据丢失,但因不是关键业务,问题并不严重。不过还是决定作进一步的调查,来看下问题到底出现在哪。首先注意到的是,服务器通过了所有的单元测试和完整的集成的测试。在测试下使用测试数据时运行正常,那么为什么在生产中运行会出现问题呢?很容易会想到,也许是因为实际运行时的负载大于测试时的负载,甚至超过了设计的负荷,从而耗尽了资源。但是到底是什么资源,在哪里耗尽了呢?下面我们就研究这个问题
为了演示这个问题,首先要做的是编写一些内存泄露的代码,将使用生产-消费者模式去实现,以便更好说明问题。
例子中,假定有这样一个场景:假设你为一个证劵经纪公司工作,这个公司将股票的销售额和股份记录在数据库中。通过一个简单进程获取命令并将其存放在一个队列中。另一个进程从该队列中读取命令并将其写入数据库。命令的POJO对象十分简单,如下代码所示:
这个POJO对象是Spring应用的一部分,该应用有三个主要的抽象类,当Spring调用它们的start()方法的时候将分别创建一个新的线程。
第一个抽象类是OrderFeed。run()方法将生成一系列随机的Order对象,并将其放置在队列中,然后它会睡眠一会儿,又再接着生成一个新的Order对象,代码如下:
网友评论 ()条 查看