我的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:
@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():
@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:
@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);
}
}存储库代码:
@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();
}
}
}以及调用存储库方法时发生的错误的屏幕截图:

发布于 2022-03-30 01:52:36
@kei101895 101895
在couchbaseCluster中已经定义了一个AbstractCouchbaseConfiguration bean。如果我没有弄错的话,那就是@Autowired将使用的集群(我相信,因为它以前是其他@Beans所需要的,并且已经创建了)。
该couchbaseCluster使用couchbaseClusterEnvironment bean,它指定了一个destroyMethod。这将确保在ClusterEnvironment上调用关机()
@Bean(destroyMethod = "shutdown")
public ClusterEnvironment couchbaseClusterEnvironment() {...要自定义所提供的集群@Bean的环境,可以@重写couchbase配置类中的configureEnvironment(builder)方法。
如果您确实希望/需要拥有您自己的集群bean,可以在@Bean("myBeanName")中给它取一个名称,然后用以下方法引用它:
AnnotationConfigApplicationContext(Config.class);myCluster =(集群) ac.getBean("myBeanName");
https://stackoverflow.com/questions/71568446
复制相似问题