我们的服务器在工作中遇到问题,我正在努力了解正在发生的事情。它是一个在linux服务器上运行的Java应用程序,该应用程序从TCP套接字接收信息并分析它们并在分析后写入数据库。
有时数据包的数量太多,Java应用程序需要每秒多次写入数据库(例如100到500次)。
我尝试在自己的计算机上重现该问题,并查看应用程序如何与JProfiler一起使用。
内存看起来总是在上升,是内存泄漏(抱歉,我不是Java程序员,我是C ++程序员)?
133分钟后是否与数据库连接太多(应用程序使用BasicDataSource类来使用连接池)?
程序没有FIFO来管理从TCP端口进入的连续信息的数据库写入。我的问题是(记得我不是Java程序员,我不知道这是Java应用程序应该工作的方式还是程序可以更有效地编程)
您是否认为代码没有正确管理数据库的写入,读取,更新以及耗费太多内存和CPU时间,或者它是否在BasicDataSource类中工作?
您如何通过创建FIFO并删除创建过多线程的代码部分来解决此问题(如果您认为这是一个问题)?或者线程本身不是应用程序线程,那就是BasicDataSource线程?
答案 0 :(得分:0)
有几个方面需要深入研究,但首先我会尝试找到实际阻塞相关主题的内容。我会假设在查看应用程序之前的所有内容,所以这是来自应用程序。
我知道图表显示可用内存,但它们只是时间点,所以我看不到趋势。 GC记录可用,我还没有使用过JProfiler,所以我不确定如何在该工具中指向它。我知道在DynaTrace中我可以看到GC事件及其持续时间以及任何其他阻塞事件及其根本原因。如果这不可用,则有命令行开关记录GC活动以查看其持续时间和频率。这是一个可以阻止的领域。
我还会查看您的池中有多少个连接。如果有100-500个请求/秒尝试写入并且它们正在堆叠,因为您没有足够的连接来处理它们,那么这也可能是一个问题。该图像显示了所有交易,但没有说明池大小。无处可去的交易也可能导致你的记忆跳跃。
还有另一方面,你的数据库无法处理流量并被挂钩,这就是阻止连接的原因所以你要监视那些事情的结尾,看看是否是阻塞的可能原因。
还有可能从正在运行的SQL中发生阻塞,等待释放页锁等。
要查看的区域很多,但我会从应用程序开始逐步解决并验证一个图层并进行处理。