首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Java分析OutOfMemoryError堆转储

用Java分析OutOfMemoryError堆转储
EN

Stack Overflow用户
提问于 2022-03-22 07:46:17
回答 1查看 230关注 0票数 2

我的Java程序不断地获得OutOfMemoryError,我相信在某个地方存在内存泄漏。在研究这个问题时,多个站点建议使用Eclipse工具,因此我在命令中添加了-XX:+HeapDumpOnOutOfMemoryError标志,以便在下次发生错误时获得堆转储。在检查转储时,占用空间最大的对象是“由"org.springframework.boot.loader.LaunchedURLClassLoader @0x6c7c24510加载的17,481个”org.springframework.boot.loader.LaunchedURLClassLoader实例“,占1,978,652,856字节(59.03%)。

我认为这是记录器打印了太多的日志,因为Java代码在INFO级别上打印了很多日志,所以我尝试将日志级别设置为WARN,但是在尝试之后,结果是相同的。如有任何见解或建议,将不胜感激。

编辑:我们代码的某些部分调用Couchbase:

代码语言:javascript
复制
@Autowired
private CouchbaseConfig couchbaseConfig;

public List<ArLedger> getBranchArLedgers(String branchId, String fromDate, String toDate) {
        
    String query = Queries.GET_AR_LEDGER_BY_BRANCH_AND_DATE_RANGE;
    query = MessageFormat.format(query, branchId, fromDate, toDate);

    Cluster cluster = null;
        
    try {
        cluster = couchbaseConfig.connectToCouchbase();
        QueryResult queryResult = cluster.query(query);
    
        return queryResult.rowsAs(ArLedger.class);
    } catch (Exception e) {
        e.printStackTrace();
        return Collections.emptyList();
    } finally {
        if (cluster != null) {
            cluster.disconnect();
        }
    }
}

以及注入的connectToCouchbase():

代码语言:javascript
复制
@Value("${app.couchbase.connection-string}")
private String connectionString;

@Value("${app.couchbase.username}")
private String username;

@Value("${app.couchbase.password}")
private String password;

public Cluster connectToCouchbase() {
    return Cluster.connect(connectionString, username, password);
}

编辑2:按照dnault的建议更新代码,以及运行代码时出现的错误的屏幕截图:

CouchbaseConfig:

代码语言:javascript
复制
@Configuration
public class CouchbaseConfig extends AbstractCouchbaseConfiguration {

    @Autowired
    private ApplicationContext context;

    @Value("${app.couchbase.connection-string}")
    private String connectionString;

    @Value("${app.couchbase.username}")
    private String username;

    @Value("${app.couchbase.password}")
    private String password;

    @Bean
    public Cluster couchbaseCluster() {
        return Cluster.connect(connectionString, username, password);
    }
}

存储库代码:

代码语言:javascript
复制
@Repository
public class ArLedgerRepository {
    
    @Autowired
    private Cluster couchbaseCluster;

    public List<ArLedger> getAllBranchArLedgers(String branchId, String fromDate, String toDate) {
        
        String query = Queries.GET_ALL_AR_LEDGERS_BY_BRANCH_AND_DATE_RANGE;
        query = MessageFormat.format(query, branchId, fromDate, toDate);
        try {
            
            QueryResult queryResult = couchbaseCluster.query(query);
    
            return queryResult.rowsAs(ArLedger.class);
        } catch (Exception e) {
            e.printStackTrace();
            return Collections.emptyList();
        } finally {
            couchbaseCluster.disconnect();
        }
    }
}

以及调用存储库方法时发生的错误的屏幕截图:

EN

回答 1

Stack Overflow用户

发布于 2022-03-30 01:52:36

@kei101895 101895

在couchbaseCluster中已经定义了一个AbstractCouchbaseConfiguration bean。如果我没有弄错的话,那就是@Autowired将使用的集群(我相信,因为它以前是其他@Beans所需要的,并且已经创建了)。

该couchbaseCluster使用couchbaseClusterEnvironment bean,它指定了一个destroyMethod。这将确保在ClusterEnvironment上调用关机()

代码语言:javascript
复制
@Bean(destroyMethod = "shutdown")
public ClusterEnvironment couchbaseClusterEnvironment() {...

要自定义所提供的集群@Bean的环境,可以@重写couchbase配置类中的configureEnvironment(builder)方法。

如果您确实希望/需要拥有您自己的集群bean,可以在@Bean("myBeanName")中给它取一个名称,然后用以下方法引用它:

AnnotationConfigApplicationContext(Config.class);myCluster =(集群) ac.getBean("myBeanName");

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71568446

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档