4

我部署了一个我构建的 Grails 应用程序(我创建的第一个应用程序),该应用程序启动时的内存使用量约为 2 GB。(雄猫 6)

该应用程序维护 4 种类型之间的大约 133,000 个域对象。对数据库的大多数事务是通过大约 115,000 个对象和正常的 CRUD 操作/文件导入和导出进行搜索。

经过多次使用,我看到我的内存标记为 3.3 GB。

首先 - 为什么启动时内存使用率如此之高?Grails 默认会在内存中缓存域对象的使用吗?

第二 - 我已经在应用程序的多个点处理了 GORM 清理,但内存使用率仍然很高(3.3GB)。ORM 层中是否存在导致事务缓存等的内容?

谢谢


---------------编辑--------

测试:我从数据库中删除了所有域对象

启动:514 MB

带对象:993 MB(我根据 DataSource 文件调整了一些性能)


** 数据源 **

dataSource {
pooled = true
driverClassName = "com.mysql.jdbc.Driver"
username = "xxx"
password = "xxx"
}
hibernate {
cache.use_second_level_cache = false
cache.use_query_cache = true
cache.region.factory_class = 'net.sf.ehcache.hibernate.EhCacheRegionFactory'
}
// environment specific settings
environments {
development {
    dataSource {
        dbCreate = "update"
        url = "jdbc:mysql://localhost/mydb"
    }
}
test {
    dataSource {
        dbCreate = "update"
        url = "jdbc:mysql://localhost/mydb"
    }
}
production {
    dataSource {
        dbCreate = "update"
        url = "jdbc:mysql://localhost/mydb"
    }
}
}
4

3 回答 3

2

Grails 是一个内存猪。

您使用的是 hsqldb 还是 mysql 后端数据库?

如果您使用的是默认的 hsqlbd,我的猜测是导致问题的 Hsqldb 默认设置。

我的建议是将其添加到您的 DataSource.groovy

url = "jdbc:hsqldb:file:" + location + "/prodDb_v02;hsqldb.default_table_type=cached;shutdown=true"

第一部分 jdbc:hsqldb:file:..... 只是设置数据库的位置

重要的部分是 hsqldb.default_table_type=cached;

这会将默认类型从内存更改为缓存。

好好写到这里...

http://www.jroller.com/alessiopace/entry/hsqldb_memory_and_cached_tables

于 2012-05-01T18:37:26.297 回答
2

您使用二级缓存查询缓存,以便解释您的一些内存使用情况。

除此之外,很难盲目猜测为什么要使用这么多内存。这可能是很多事情,所以在你开始切换开关和跟踪测试之前,我建议使用JavaMelodyEhcache monitor之类的东西。这将帮助您了解幕后发生的事情以及您所做更改的影响。

Grails 确实比一些类似的框架消耗更多的内存,但是像这样的性能问题通常是由代码库配置引起的。此外,您可能想在这里查看一些可能有帮助的 JVM 选项。

祝你好运。

于 2012-05-02T11:28:51.600 回答
2

JVM 选项: -server -Xms512m -Xmx1048M -XX:MaxPermSize=1048m -XX:+UseParallelGC -XX:-UseGCOverheadLimit

JavaMelodyperf4j:-帮助您查看内存使用情况/内容/方式

请参阅此http://burtbeckwith.com/blog/?p=73 和此http://grails.1312388.n4.nabble.com/Memory-leak-td1358871.html 和此http://www.componentix.com /blog/8/run-long-batch-processing-jobs-in-grails-without-memory-leaks

于 2012-05-09T18:06:58.773 回答