Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance Grails2.0.3中字节[]的内存泄漏_Performance_Tomcat_Grails_File Upload_Memory Leaks - Fatal编程技术网

Performance Grails2.0.3中字节[]的内存泄漏

Performance Grails2.0.3中字节[]的内存泄漏,performance,tomcat,grails,file-upload,memory-leaks,Performance,Tomcat,Grails,File Upload,Memory Leaks,因此,我有一个应用程序,允许您上传文档和图像,并将它们保存为数据库中的字节[] (我创建了一个最小的示例项目,您可以在这里以zip格式下载并导入到STS中……您所要做的就是转到datasource.groovy并更改您的db设置) 所以域对象看起来像这样: class Test { byte[] data static constraints = { data nullable: false, maxSize: 1024*1024*40 }

因此,我有一个应用程序,允许您上传文档和图像,并将它们保存为数据库中的字节[]

(我创建了一个最小的示例项目,您可以在这里以zip格式下载并导入到STS中……您所要做的就是转到datasource.groovy并更改您的db设置)

所以域对象看起来像这样:

class Test { 

    byte[] data 

    static constraints = { 
        data nullable: false, maxSize: 1024*1024*40 
    } 
} 
控制器和视图都是通过generateall命令直接生成的。。。这里什么都没变

所以现在当我们开始项目时,我们去测试控制器。。。点击新建。。。上载文档。。。使用5-10MB之类的东西。。。然后点击创建

我希望在执行save()方法时,以及在调用show方法时,内存使用量会增加。。。但一旦这些都完成加载GC应该拿起这些对象并扔掉,因为他们目前不需要。。。现在,我使用您的工具包Java Profiler检查内存使用情况,我可以看到我的字节[]有3个引用,它们的引用较弱或无法访问。。。为什么呢?当show()方法或save()方法完成时,它们不应该被删除吗

下面是一个屏幕截图:[内存泄漏]:

为了更频繁地运行gc,我是否必须对tomcat进行特殊设置

我对此感到非常困惑,它实际上导致了我现在测试的应用程序中的一个问题,因为人们正在向它上传大量文档,堆内存越来越满,而且几乎从未清理过,所以我在某个时候遇到了内存不足异常。。。同样的情况实际上也发生在list()方法中,它加载所有对象,现在实际上每个对象的字节[]都被加载,现在在内存中,并且不会被清除

也许我只是错过了什么或者做错了什么。。。任何帮助都将不胜感激

谢谢
Chris

Grails应用程序通常使用在服务器模式下创建的JRE运行,这会影响内存的工作方式。基本上,在“客户端”模式下运行时,JRE会尝试使用更少的内存并更频繁地释放内存,而在服务器模式下运行时,JRE会尝试使用更多内存以提供更高的速度。您可以在此处阅读一些讨论:

基本上,JRE将允许堆增长到极限,只有到那个时它才会考虑释放内存

我下载了您的示例并启动了它,然后多次上传了相同的文件。java进程的内存使用量如下增长(对于每个请求:822mb->917mb->1.03mb,然后停止。下一次上载不会增加内存使用量,也不会引发PermGen空间异常)

所以,我认为这里没有发生内存泄漏。您所经历的只是JRE尝试不运行GC,直到它仍然可以分配新的内存(因为一般来说,运行GC比只分配新内存慢)


希望这有帮助。

您可以尝试使用选项-XX:+UseConMarkSweepGC。此选项在执行应用程序的同时收集终身收藏。在收藏过程中,应用程序会暂停一小段时间。

+1因为包含了一个人们可以下载的示例项目,很高兴看到您的问题得到了很好的解决。我没有回答很抱歉,但我会关注这一点。我的问题是,我的实际生产中有一个应用程序,它只是在不断增长,并且随着人们上传文件而增加内存,我猜gc清理它的速度不够快……你知道有什么jvm选项可以对其进行调优吗?