【问题标题】:Grails - Startup Memory/Memory Usage/Domain objectsGrails - 启动内存/内存使用/域对象
【发布时间】:2012-05-01 18:16:39
【问题描述】:

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

该应用程序维护 4 种类型之间的大约 133,000 个域对象。对 DB 的大多数事务是通过大约 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"
    }
}
}

【问题讨论】:

  • 所以您的域对象平均为 3.7 KB?咳咳,很多。
  • 对象包含大量数据(其中 115,000 个对象每个大约有 17 个属性)。这可能是一个设计问题,但我看不到提取特定领域属性的方法。

标签: mysql memory grails grails-orm


【解决方案1】:

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

【讨论】:

    【解决方案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

    【讨论】:

    • 使用MySql。我将抛出我的 DataSource 文件内容。现在阅读该链接,以防万一有些东西有用(即使它是 HSQL)。
    • 所以我没有对 MySql 和 grails 做过任何事情。但是我使用过大型域表。我想有些东西仍然存在于记忆中。
    • 我的建议是使用 java visual vm 并监控应用程序的内存占用以查看它的峰值
    • 谢谢 Nate - 我会下载它,看看有什么进展。我也倾向于认为某些东西(比如我的对象)正在存储在内存中。
    • 您还启用了二级缓存,这将使用内存。如前所述,Grails(嗯,实际上是 Hibernate 比什么都重要)使用了相当多的内存。 RAM 很便宜。
    【解决方案3】:

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

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

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

    祝你好运。

    【讨论】:

    • “Grails 确实比一些可比较的框架消耗更多的内存”,请定义“可比较的框架”。我对 Rails、Django 和 Grails 之间的资源消耗做了一些比较,Grails 消耗的内存几乎是其他空白页的 10 倍......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-18
    • 2015-01-06
    • 2013-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多