在 SpringBoot 应用程序中使用 V2 AWS DynamoDB SDK 导致 Tenured 或 Old Gen 内存峰值

问题描述 投票:0回答:1

我们有一个 springboot 应用程序与 DynamoDB 表通信,该表使用 V2 AWS SDK 和 DynamoDBEnhancedClient。在将应用程序部署到 EKS 并运行负载测试时,我们发现一个问题,即由于大量请求,应用程序按预期消耗了大量内存。 enter image description here

但是,在负载测试于下图中的 1:09 停止后,我们预计内存将被声明并恢复,但即使没有更多传入请求,它仍然保持在高位。

enter image description here

这就是应用程序的连接方式。

我们有实例化 DynamoDB 客户端 BEAN 的配置类。

@Configuration
@RequiredArgsConstructor
@Getter
public class DynamoConfiguration {

    @Bean
    @Profile({"!local & !integrationtest"})
    public DynamoDbClient getDynamoDbClient() {
        return DynamoDbClient.builder()
            .region(Region.of(System.getenv("AWS_REGION")))
            .credentialsProvider(WebIdentityTokenFileCredentialsProvider.builder().build()).build();
    }
    
    /**
     * Instantiates an enhanced DynamoDB client for interacting with DynamoDB.
     */
    @Bean
    public DynamoDbEnhancedClient getDynamoDbEnhancedClient(DynamoDbClient dynamoDbClient) 
    {
        return DynamoDbEnhancedClient.builder()
            .dynamoDbClient(dynamoDbClient)
            .build();
    }
}

接下来,我们有一个 Student 表的存储库类,客户端首先用于生成表对象,并在表上执行所有 CRUD 操作。

注意:负载测试对 findById 函数很重,而不是对 save 函数,因此读取量很大。

@Repository
@RequiredArgsConstructor
public class StudentRepository {

    private final DynamoDbEnhancedClient dynamoDbEnhancedClient;
    
    @Value("${dynamodb.tables.student}")
    private String studentTableName;

    /**
     * Retrieves a student by id.
     */
    public Optional<Student> findById(final String id) {
        DynamoDbTable<Student> studentTable = getTable();
        Key idKey = Key.builder().partitionValue(id).build();
        return Optional.ofNullable(studentTable.getItem(idKey));
    }

    /**
     * Saves a student to the table.
     */
    public void save(final Student Student) {
        DynamoDbTable<Student> studentTable = getTable();
        studentTable.putItem(Student);
    }
    
    /**
     * Gets Student table object.
     */
    private DynamoDbTable<Student> getTable() {
        return dynamoDbEnhancedClient.table(studentTableName, TableSchema.fromBean(Student.class));
    }
}

对于我们在此设置中做错的任何事情,特别是使用 @Bean 和 @Repository 注释,有什么指导吗?或者我们需要做什么来终止数据库连接或表对象以确保请求回收后的内存?

或者如果阻塞客户端存在线程问题,我们是否需要尝试使用增强异步客户端?

欢迎任何其他建议,因为 SDK V2 相当新,并且并未记录所有问题。

这是 SDK 的 POM 版本:2.19.18 以及我们正在使用的两个库。

<dependency>
    <groupId>software.amazon.awssdk</groupId>
    <artifactId>dynamodb-enhanced</artifactId>
    <version>${aws.java.sdk.version}</version>
</dependency>
<dependency>
    <groupId>software.amazon.awssdk</groupId>
    <artifactId>sts</artifactId>
    <version>${aws.java.sdk.version}</version>
</dependency>
<aws.java.sdk.version>2.19.18</aws.java.sdk.version>

更新: 保留的统治者的HeapDump: enter image description here

保留对象的堆转储: enter image description here

java amazon-web-services spring-boot memory-leaks amazon-dynamodb
1个回答
0
投票

内存泄漏的解决方案你解决了吗?我遇到了同样的问题

© www.soinside.com 2019 - 2024. All rights reserved.