我部署了我构建的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"
}
}
}
答案 0 :(得分: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
答案 1 :(得分:2)
您使用二级缓存和查询缓存,以便解释您的部分内存使用情况。
除此之外,很难盲目猜测为什么你要使用这么多内存。这可能是很多事情,所以,在你开始翻转开关和逐行测试之前,我建议使用JavaMelody或Ehcache monitor之类的东西。这将有助于您了解窗帘背后的情况以及您所做的更改的影响。
Grails比一些类似的框架消耗的少更多的内存,但这些性能问题通常是由代码库和配置引起的。此外,您可能希望在某些可能有用的JVM选项中查看here。
祝你好运。答案 2 :(得分:2)
JVM选项: -server -Xms512m -Xmx1048M -XX:MaxPermSize = 1048m -XX:+ UseParallelGC -XX:-UseGCOverheadLimit
JavaMelody和perf4j: - 帮助您了解内存使用的位置/内容/方式
见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 这个