gpt4 book ai didi

java - 完成任务后显示 RAM Activity 增加的 Jar

转载 作者:行者123 更新时间:2023-12-02 04:57:47 25 4
gpt4 key购买 nike

我有一个 KeywordCount 类,它对给定的句子进行标记,并使用 Apache OpenNLP-POS 标记器的 maxent 标记器对其进行标记。我首先对输出进行标记,然后将其提供给标记器。 jar 完成其任务后,我遇到了 RAM 使用量高达 165 MB 的问题。程序的其余部分只是进行数据库调用并检查新任务。我已将泄漏隔离到此类。您可以安全地忽略 Apache POI Excel 代码。我需要知道你们是否能找到代码中的漏洞。

public class KeywordCount {
Task task;
String taskFolder = "";
List<String> listOfWords;

public KeywordCount(String taskFolder) {
this.taskFolder = taskFolder;
listOfWords = new ArrayList<String>();
}

public void tagText() throws Exception {
String xlsxOutput = taskFolder + File.separator + "results_pe.xlsx";

FileInputStream fis = new FileInputStream(new File(xlsxOutput));
XSSFWorkbook wb = new XSSFWorkbook(fis);
XSSFSheet sheet = wb.createSheet("Keyword Count");
XSSFRow row = sheet.createRow(0);
Cell cell = row.createCell(0);

XSSFCellStyle csf = (XSSFCellStyle)wb.createCellStyle();
csf.setVerticalAlignment(CellStyle.VERTICAL_TOP);
csf.setBorderBottom(CellStyle.BORDER_THICK);
csf.setBorderRight(CellStyle.BORDER_THICK);
csf.setBorderTop(CellStyle.BORDER_THICK);
csf.setBorderLeft(CellStyle.BORDER_THICK);
Font fontf = wb.createFont();
fontf.setColor(IndexedColors.GREEN.getIndex());
fontf.setBoldweight(Font.BOLDWEIGHT_BOLD);
csf.setFont(fontf);



int rowNum = 0;
BufferedReader br = null;
InputStream modelIn = null;
POSModel model = null;
try {
modelIn = new FileInputStream("taggers" + File.separator + "en-pos-maxent.bin");
model = new POSModel(modelIn);
}
catch (IOException e) {
// Model loading failed, handle the error
e.printStackTrace();
}
finally {
if (modelIn != null) {
try {
modelIn.close();
}
catch (IOException e) {
}
}
}
File ftmp = new File(taskFolder + File.separator + "phrase_tmp.txt");
if(ftmp.exists()) {
br = new BufferedReader(new FileReader(ftmp));
POSTaggerME tagger = new POSTaggerME(model);
String line = "";
while((line = br.readLine()) != null) {
if (line.equals("")) {
break;
}
row = sheet.createRow(rowNum++);
if(line.startsWith("Match")) {
int index = line.indexOf(":");
line = line.substring(index + 1);
String[] sent = getTokens(line);
String[] tags = tagger.tag(sent);
for(int i = 0; i < tags.length; i++) {
if (tags[i].equals("NN") || tags[i].equals("NNP") || tags[i].equals("NNS") || tags[i].equals("NNPS")) {
listOfWords.add(sent[i].toLowerCase());
} else if (tags[i].equals("JJ") || tags[i].equals("JJR") || tags[i].equals("JJS")) {
listOfWords.add(sent[i].toLowerCase());
}
}

Map<String, Integer> treeMap = new TreeMap<String, Integer>();
for(String temp : listOfWords) {
Integer counter = treeMap.get(temp);
treeMap.put(temp, (counter == null) ? 1 : counter + 1);
}
listOfWords.clear();
sent = null;
tags = null;
if (treeMap != null || !treeMap.isEmpty()) {
for(Map.Entry<String, Integer> entry : treeMap.entrySet()) {
row = sheet.createRow(rowNum++);
cell = row.createCell(0);
cell.setCellValue(entry.getKey().substring(0, 1).toUpperCase() + entry.getKey().substring(1));
XSSFCell cell1 = row.createCell(1);
cell1.setCellValue(entry.getValue());
}
treeMap.clear();
}
treeMap = null;
}
rowNum++;
}
br.close();
tagger = null;
model = null;
}
sheet.autoSizeColumn(0);
fis.close();

FileOutputStream fos = new FileOutputStream(new File(xlsxOutput));
wb.write(fos);
fos.close();
System.out.println("Finished writing XLSX file for Keyword Count!!");
}

public String[] getTokens(String match) throws Exception {
InputStream modelIn = new FileInputStream("taggers" + File.separator + "en-token.bin");
TokenizerModel model = null;
try {
model = new TokenizerModel(modelIn);
}
catch (IOException e) {
e.printStackTrace();
}
finally {
if (modelIn != null) {
try {
modelIn.close();
}
catch (IOException e) {
}
}
}

Tokenizer tokenizer = new TokenizerME(model);
String tokens[] = tokenizer.tokenize(match);
model = null;

return tokens;
}

}

我的系统在 165MB 后对 RAM 进行了 GC...但是当我上传到服务器时,GC 并未执行,它上升到 480 MB(RAM 使用量的 49%)。

最佳答案

首先,堆使用量增加并不是内存泄漏的证据。可能只是 GC 尚未运行。

话虽如此,任何人都可以通过“观察”您的代码来发现内存泄漏,这是值得怀疑的。解决这个问题的正确方法是 >>you<< 阅读查找 Java 内存泄漏的技术,然后 >>you<< 然后使用相关工具(例如 VisualVM、jhat 等)自行查找问题.

以下是查找存储泄漏的一些引用:

<小时/>

注意 1:此链接可能会损坏。如果是,请使用 Google 查找该文章。

<小时/>

I have isolated the leak to this class. You can safely ignore the Apache POI Excel code.

如果我们忽略 Apache POI 代码,潜在内存“泄漏”的唯一来源是保留单词列表 ( listOfWords )。 (调用 clear() 会将其内容清空,但保留后备数组,并且该数组的大小由最大列表大小决定。从内存占用的角度来看,最好将列表包含一个新的空列表。)

但是,如果您保留对 KeywordCount 实例的引用,那么这只是“泄漏”。如果您这样做是因为您正在使用该实例,那么我根本不会称其为泄漏。

关于java - 完成任务后显示 RAM Activity 增加的 Jar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28599330/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com