连接到H2服务器时,我从应用程序用户那里得到了几个内存不足异常的报告。在尝试重现时,我使用jconsole连接到H2服务器并检查发生了什么。
我发现当我第一次连接到H2服务器并加载数据库时,H2服务器开始消耗大量内存。在加载任何数据库之前,H2服务器仅消耗3M内存。使用连接到H2的Squirrel SQL客户端并加载250M文件数据库后,H2服务器消耗大约1G内存。这可能是什么原因发生的?
H2服务器启动命令: java -Xmx2g -Xms16m -XX:PermSize = 16m -XX:MaxPermSize = 256m -cp“h2-1.3.173.jar;%H2DRIVERS%;%CLASSPATH%”org.h2.tools.Server -tcp -tcpPort 9097 -tcpAllowOthers -baseDir C:\ temp \ h2db
我的连接字符串:jdbc:h2:tcp:// localhost:9097 / db1; DB_CLOSE_DELAY = -1
其他信息: 我们在数据库中有相当多的表(1200+),以及在这些表上联合或加入的800多个视图。这会是这个问题的原因吗?在加载这样的数据库时,是否有任何可以减少内存消耗的解决方案?
答案 0 :(得分:1)
在分析堆转储后,发现大多数内存都被视图元数据占用。对于我们的案例,有2500多个视图,其元数据占用550M堆大小。有关这方面的详细讨论可以在这里找到: https://groups.google.com/forum/#!topic/h2-database/4IWPu70yY5U
Thomas承认应该改进当前的h2视图元数据以减少内存使用量。