我编写了一个使用数据库的简单应用程序。我的程序有一个表格来显示数据库中的数据。当我尝试扩展框架时,程序因 OutOfMemory 错误而失败,但如果我不尝试这样做,它运行良好。
我用 -Xmx4m 参数启动我的程序。是否真的需要超过 4 兆字节才能处于展开状态?
另一个问题:如果我运行 java visualVM,我会看到我的程序的堆使用情况的锯齿形图表,而其他使用 java VM 的程序(例如 netbeans)有更多的直线图表。为什么我的程序的堆使用如此不稳定,即使它什么也不做(只等待用户按下按钮)?
最佳答案
您可能想尝试设置此值以生成详细的堆转储以准确显示正在发生的事情。
-XX:+HeapDumpOnOutOfMemoryError
2011 年典型的“小型”Java 桌面应用程序将以 ~64-128MB 运行。除非您真的有紧迫的需求,否则我会先将其设置为默认值(即无设置)。
如果您尝试做一些不同的事情(例如在 Android 设备上运行它),您将需要非常熟悉分析(并且您可能应该使用该标签发布)。
请记住,您的 100 条记录缓存(~12 字节)可能(可能)是存储字符数据(Java 在内部使用 UCS-16)时的两倍。
RE:“不稳定”,JVM 将为您处理内存使用情况,并将根据它选择的任何算法执行垃圾收集(多年来这些算法发生了巨大变化)。图形可能只是工具和采样周期的产物。桌面应用的性能受到大量因素的影响。
例如,我们曾经有一个巨大的内存“泄漏”,它只出现在一次自动化测试中,但从未出现在正常的现实世界使用中。结果是,测试将鼠标悬停在工具提示上,其中包括打开文件的名称,而该文件又包含一组对整个(巨大)项目的引用。将鼠标 Swing 几个像素即可摆脱工具提示,这意味着所有引用都已清除,垃圾收集器已清除垃圾。
故事的寓意?您需要在内存不足时捕获确切的堆转储并非常仔细地检查它。
关于Java 堆大小使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5556095/