java - JVM 堆问题
问题描述
我正在对我在工作中使用的项目设置进行一些研究。
我注意到不少应用程序似乎存在内存泄漏/堆问题。我注意到,当我启动一个应用程序时,前 15 分钟它似乎从 1% 的堆使用量跃升至 20%,然后它将开始趋于平稳并始终只使用大约 1%。
public void testPersist() {
while (true) {
List<TestModel> testModels = createTestModels();
testModelManager.save(testModels);
testModels = null;
ApplicationPerformanceSampler.sampleMemory();
}
}
/**
* @return
*/
private List<TestModel> createTestModels() {
List<TestModel> testModels = new ArrayList<>();
for (int i = 0; i < 5000; i++) {
TestModel testModel = new TestModel();
testModel.setTestString("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789");
testModels.add(testModel);
}
return testModels;
}
这是我使用 spring、hibernate 和 JPA 将对象持久保存到 MySQL 数据库的示例应用程序。
/** {@inheritDoc} */
@Override
public void save(final T model) {
LOG.debug("save model={}", model);
em.persist(model);
LOG.debug("model saved. id={}", model.getId());
}
我写了一个小类来采样内存,因为我最初认为内存占用会随着它的持续而变大。
public static void sampleMemory() {
Runtime runtime = Runtime.getRuntime();
long maximumAllocatedMemory = runtime.maxMemory();
long allocatedMemory = runtime.totalMemory() - runtime.freeMemory();
long freeMemory = maximumAllocatedMemory - allocatedMemory;
Double freeMemoryDouble = Double.valueOf(freeMemory);
Double maximumAllocatedMemroryDouble = Double.valueOf(maximumAllocatedMemory);
Double percentageFreeMemory = freeMemoryDouble / maximumAllocatedMemroryDouble * 100;
ApplicationPerformanceStatus appStatus = determineAppStatus(percentageFreeMemory);
Double usedHeap = 100 - percentageFreeMemory;
LOG.info("usedHeap={}%, freeHeap={}%, appStatus={}", format(usedHeap), format(percentageFreeMemory),
appStatus.getText());
}
但是,当我附加 visualVM 时,我看到了以下内容?
堆超过 30 分钟
下面我包含了一些日志消息的示例(每条记录在 5000 条记录后被持久化。我已经看到并放入日志中,我知道已经进行了垃圾收集。
2019-10-02 10:58:37.035 INFO [main] (ApplicationPerformanceSampler.java:52) - usedHeap=9.14%, freeHeap=90.86%, appStatus=OK
2019-10-02 10:58:38.933 INFO [main] (ApplicationPerformanceSampler.java:52) - usedHeap=9.96%, freeHeap=90.04%, appStatus=OK
2019-10-02 10:58:40.226 INFO [main] (ApplicationPerformanceSampler.java:52) - usedHeap=10.92%, freeHeap=89.08%, appStatus=OK
2019-10-02 10:58:41.616 INFO [main] (ApplicationPerformanceSampler.java:52) - usedHeap=4.02%, freeHeap=95.98%, appStatus=OK
(Garbage collection)
2019-10-02 10:58:42.878 INFO [main] (ApplicationPerformanceSampler.java:52) - usedHeap=5.06%, freeHeap=94.94%, appStatus=OK
2019-10-02 10:58:44.215 INFO [main] (ApplicationPerformanceSampler.java:52) - usedHeap=5.96%, freeHeap=94.04%, appStatus=OK
2019-10-02 10:58:45.576 INFO [main] (ApplicationPerformanceSampler.java:52) - usedHeap=7.0%, freeHeap=93.0%, appStatus=OK
2019-10-02 10:58:47.001 INFO [main] (ApplicationPerformanceSampler.java:52) - usedHeap=8.04%, freeHeap=91.96%, appStatus=OK
2019-10-02 10:58:48.333 INFO [main] (ApplicationPerformanceSampler.java:52) - usedHeap=9.09%, freeHeap=90.91%, appStatus=OK
2019-10-02 10:58:49.651 INFO [main] (ApplicationPerformanceSampler.java:52) - usedHeap=10.28%, freeHeap=89.72%, appStatus=OK
(Garbage collection)
我不太确定从这里去哪里?
解决方案
推荐阅读
- python - Python ctypes 不适用于结构
- c# - 客户端.ExecuteAsync
代表不接受 1 个参数 - azure-devops - 所有工作项的概述在哪里(跨所有板)
- neo4j - 如何使用 Neo4J Cypher 以分页方式进行广度优先搜索?
- scala - 如何将更大的 JSON 数据集编码为 avro?
- powershell - 基于文化的时间变量格式
- javascript - 如何使用 ajax 请求发送大于 1MB 的文件?
- windows - 使 localhost 上的 netty 服务器可通过 Internet 访问
- c# - .ApiClient.Model.Rate 无法序列化,因为它没有无参数构造函数?
- c# - C# 根据整数 ID 从自定义对象列表创建唯一校验和/哈希