[英]Java Memory Heap Space Issue in Open Shift Container with MongoDb driver
下面的 Java 語法是在調用來自 Mongodb 數據庫的數據時在 Openshift 中拋出 Java 內存堆問題。任何人都可以用Java8 幫助我使用Pojo 類的每個synatx。這里Amount 是POJO 類。 或者任何其他建議也可以減少太多請求的內存。
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);
}
}
首先 - 你的 foreach 循環沒問題,除了你沒有顯示你正在迭代的getAmount
是什么。 所以假設它是一個錯字,基本上你要求 mongo 根據一些標准為你帶來所有的“Amount”對象,而這一切只是為了計算一些值的總和。
如果數據庫中有很多對象,這將是:
我不會說這里有泄漏,只是無效的流程。 在 OpenShift 中,您可能會在一些“嚴重”的環境中工作,如果同時在大量對象上運行許多請求,您最終可能會遇到 OutOfMemory。
為了驗證這個理論,您可以記錄從 mongo 獲得的許多對象( amount
列表的大小)。 如果您有相當大的數字,請繼續閱讀。
現在在解決方案方面:
所以也許你應該讓 mongo 為你計算一個總和,而不是用 Java 來計算。 即使集合中有很多文檔,Mongo 也會處理這個問題。
我已經很多年沒有使用 mongo,但它有一個聚合框架,應該使用$sum
。
閱讀 此 SO 線程,因為它們提供了如何在 mongo 中實現類似任務的示例。
您也可以閱讀此線程,了解您所做的更復雜的示例。
這是 mongo 文檔的鏈接,也可以派上用場
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.