H2数据库内存清理RAM

6
我使用H2 DB的内存模式处理一些数据。我的Java应用程序在每次运行时需要重置或截断或删除H2 DB中的所有对象,但需要保持JVM打开状态。因此,我需要在DB URL中使用“DB_CLOSE_DELAY=-1”选项。
为了在迭代后清除内存,我尝试使用“DROP ALL OBJECTS”,“DROP ALL OBJECTS DELETE FILES”以及逐个截断每个表。所有这些都实现了我的目标,但没有删除当前占用的内存。我的数据库大小从大约300MB到2GB不等。因此,在单个迭代之后,我的RAM占用量为约1GB,并且没有找到任何解决方法。
与此类似的问题,参考链接:Clear the in memory database after every testcase,但不需要dbUnit并且需要清除RAM。
是否可以在不停止JVM的情况下实现这一点呢?
谢谢。

1
您可以执行语句 shutdown。这将关闭连接和数据库。 - Thomas Mueller
1个回答

5
您可以执行语句shutdown。这将关闭连接和数据库。

你好,抱歉打扰了。但是我尝试过几次解决方案,有时候可以工作,但有时候不行。我的Java进程java.exe在运行时显示已占用1.1 GB。执行关闭命令后,它被减少到约80 MB,这大约是我的程序使用的平均值。但是我发现在Windows任务管理器中,虽然进程使用的内存已经减少,但我的物理内存并没有被释放。只有在我手动结束正在使用的java.exe进程后,它才释放了约1.1 GB。 - Akalanka
我尝试了几次使用SHUTDOWN、SHUTDOWN COMPACT、SHUTDOWN IMMEDIATELY和DROP ALL OBJECTS,每个都结合之前的方法。但结果仍然相同,有时java.exe进程也无法减少内存。它保持1.1GB的分配内存不变。你是否遇到过这种情况,或者是我做错了什么。请帮忙解决。 - Akalanka
你是如何测量内存使用情况的?Java不会将未使用的堆内存返回给操作系统。但我想知道这对你是否真的是一个问题。 - Thomas Mueller
1
不,这只是Java的工作方式。另请参阅http://www.juhonkoti.net/2010/10/19/crash-course-to-java-jvm-memory-issues-to-sysadmins。 - Thomas Mueller
1
感谢@Thomas。你是正确的。数据库释放了内存。然而,JVM没有。多余的内存在下一次H2 DB创建迭代中使用,因此只有在下一次运行中DB大小增加时,使用的内存才会增加。 - Akalanka
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接