带有MongoDb驱动程序的Open Shift容器中的Java内存堆空间问题

带有MongoDb驱动程序的Open Shift容器中的Java内存堆空间问题,java,mongodb,spring-boot,Java,Mongodb,Spring Boot,下面是Java语法在调用Mongodb数据库中的数据时在Openshift中抛出Java内存堆问题。有没有办法知道内存泄漏发生在哪里。如果我们对每个流使用Java 8而不是循环使用Java 8,内存是否会减少。有谁能帮我对Pojo类中的每个synatx使用Java 8。下面是数量波乔班。或者任何其他建议也可以减少太多请求的内存 public String getAmountDetails( @RequestParam("system") @Valid String syste

下面是Java语法在调用Mongodb数据库中的数据时在Openshift中抛出Java内存堆问题。有没有办法知道内存泄漏发生在哪里。如果我们对每个流使用Java 8而不是循环使用Java 8,内存是否会减少。有谁能帮我对Pojo类中的每个synatx使用Java 8。下面是数量波乔班。或者任何其他建议也可以减少太多请求的内存

public String getAmountDetails( @RequestParam("system") @Valid String system,
                                 @RequestParam("Claims") BigDecimal Claims,
                                 @RequestParam("Bills") BigDecimal totalOfCommissions,
                                 @RequestParam("taxes") BigDecimal totalOfSurcharges,
                                 @RequestParam("userDetails") BigDecimal userDetails,
                               ) throws Exception {

        Query Query = new Query();
       
        if (system != null && !system.isEmpty())
           Query.addCriteria(Criteria.where("system").is(system));
        List<Amount> amount = new ArrayList<>();
       
        amount = mongoOps.find(Query, Amount.class);
        amount.addAll(Amount);
       
        totalAmount = new Amount();
        if (Amount.isEmpty()) {
            totalAmount.setSystem(system);
            totalAmount.setClaims(BigDecimal.ZERO);
            totalAmount.setBillsBigDecimal.ZERO);
            totalAmount.setTaxes(BigDecimal.ZERO);
            totalAmount.setuserDetails(BigDecimal.ZERO);
            totalAmount.setStatus("Success");
            return mapper.writerWithDefaultPrettyPrinter().writeValueAsString(totalAmount);
        }
        BigDecimal claims = new BigDecimal(0);
        BigDecimal bills = new BigDecimal(0);
        BigDecimal taxes = new BigDecimal(0);
        BigDecimal userDeatils = new BigDecimal(0);
      
       
        for (Amount amount : getAmount) {
            if (null != amount.getClaims()) {
                claimsAmt = claimsAmt.add(amount.getclaimsAmt().bigDecimalValue());
            }
            if (null != amount.getBillsAmt()) {
                billslAmt = billsAmt.add(amount.getBillsAmt().bigDecimalValue());
            }
            if (null != amount.gettaxesAmt()) {
                taxesAmt = taxesAmt.add(amount.getTaxesAmt().bigDecimalValue());
            }
            totalAmount.setClaims(claimsAmt);
            totalAmount.setbills(billsAmt);
            totalAmount.settaxesAmt(taxesAmt);
        }
       
    }
public String getAmountDetails(@RequestParam(“system”)@有效字符串系统,
@RequestParam(“索赔”)BigDecimal索赔,
@RequestParam(“账单”)大十进制调试总数,
@RequestParam(“taxes”)来源的大十进制总数,
@RequestParam(“userDetails”)BigDecimal userDetails,
)抛出异常{
查询=新查询();
if(system!=null&&!system.isEmpty())
Query.addCriteria(Criteria.where(“system”).是(system));
列表金额=新建ArrayList();
amount=mongoOps.find(查询,amount.class);
amount.addAll(金额);
totalAmount=新金额();
if(Amount.isEmpty()){
总金额。设置系统(系统);
totalAmount.setClaims(BigDecimal.ZERO);
总金额(setBillsBigDecimal.0);
totalAmount.setTaxes(BigDecimal.ZERO);
totalAmount.setuserDetails(BigDecimal.ZERO);
totalAmount.setStatus(“成功”);
返回mapper.writerWithDefaultPrettyPrinter().writeValueAsString(totalAmount);
}
BigDecimal声明=新的BigDecimal(0);
BigDecimal票据=新的BigDecimal票据(0);
BigDecimal税=新的BigDecimal(0);
BigDecimal userDeatils=新的BigDecimal(0);
对于(金额:getAmount){
if(null!=amount.getClaims()){
claimsAmt=claimsAmt.add(amount.getclaimsAmt().bigDecimalValue());
}
if(null!=amount.getBillsAmt()){
billslAmt=billsAmt.add(amount.getBillsAmt().bigDecimalValue());
}
if(null!=amount.gettaxesAmt()){
taxesAmt=taxesAmt.add(amount.getTaxesAmt().bigDecimalValue());
}
索赔总额(索赔);
总金额(美元);
totalAmount.settaxesAmt(taxesAmt);
}
}

首先-您的foreach循环是正常的,除了您没有显示您正在迭代的
getAmount
之外。所以假设这是一个打字错误 基本上,您要求mongo根据一些标准为您提供所有“Amount”对象,所有这些只是为了计算一些值的总和

如果数据库中有多个对象,这将是:

  • 内存消耗
我不会说这里有漏洞,只是一个无效的流程。在OpenShift中,您可能会处理一些“严重”的环境,如果有许多请求同时在大量对象上运行,那么最终可能会导致OutOfMemory

为了验证这一理论,您可以记录从mongo获得的许多对象(数量的大小)。如果你有相当大的数字,继续阅读

现在在解决方案方面:

所以,也许你应该让mongo为你计算一个总和,而不是用Java。 Mongo将处理这个问题,即使集合中有很多文档

我已经很多年没有使用mongo了,但是它有一个聚合框架,应该使用
$sum

阅读,因为他们提供了一个如何在mongo中完成类似任务的示例

此外,您还可以阅读更为复杂的示例

这里有一个to mongo文档,也很方便