我仍然是一个相对较新的程序员,我在

Java中遇到的一个问题是Out of Memory Errors.我不想使用-Xmx来增加内存,因为我觉得错误是由于编程不好造成的,我想改进编码而不是依靠更多的内存.

我所做的工作涉及处理大量文本文件,每个文本文件在压缩时大约为1GB.我在这里的代码是为了遍历一个新的压缩文本文件被删除的目录.它打开了第二个最新的文本文件(不是最新的,因为它仍然被写入),并使用Jsoup库来解析文本文件中的某些字段(字段用自定义分隔符分隔:“| nTa |”表示一个新列,“| nLa |”表示一个新行.

我觉得应该没有理由使用大量内存.我打开一个文件,扫描它,解析相关位,将解析后的版本写入另一个文件,关闭文件,然后移动到下一个文件.我不需要将整个文件存储在内存中,我当然不需要存储已经在内存中处理过的文件.

当我开始解析第二个文件时,我遇到错误,这表明我没有处理垃圾收集.请查看代码,看看你是否能发现我正在做的事情,这意味着我使用的内存比我应该的多.我想学习如何做到这一点,所以我不会出现内存错误!

import java.io.File;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.util.ArrayList;

import java.util.Collections;

import java.util.Scanner;

import java.util.TreeMap;

import java.util.zip.GZIPInputStream;

import java.util.zip.GZIPOutputStream;

import org.jsoup.Jsoup;

public class ParseHTML {

public static int commentExtractField = 3;

public static int contentExtractField = 4;

public static int descriptionField = 5;

public static void main(String[] args) throws Exception {

File directoryCompleted = null;

File filesCompleted[] = null;

while(true) {

// find second most recent file in completed directory

directoryCompleted = new File(args[0]);

filesCompleted = directoryCompleted.listFiles();

if (filesCompleted.length > 1) {

TreeMap timeStamps = new TreeMap(Collections.reverseOrder());

for (File f : filesCompleted) {

timeStamps.put(getTimestamp(f), f);

}

File fileToProcess = null;

int counter = 0;

for (Long l : timeStamps.keySet()) {

fileToProcess = timeStamps.get(l);

if (counter == 1) {

break;

}

counter++;

}

// start processing file

GZIPInputStream gzipInputStream = null;

if (fileToProcess != null) {

gzipInputStream = new GZIPInputStream(new FileInputStream(fileToProcess));

}

else {

System.err.println("No file to process!");

System.exit(1);

}

Scanner scanner = new Scanner(gzipInputStream);

scanner.useDelimiter("\\|nLa\\|");

GZIPOutputStream output = new GZIPOutputStream(new FileOutputStream("parsed/" + fileToProcess.getName()));

while (scanner.hasNext()) {

Scanner scanner2 = new Scanner(scanner.next());

scanner2.useDelimiter("\\|nTa\\|");

ArrayList row = new ArrayList();

while(scanner2.hasNext()) {

row.add(scanner2.next());

}

for (int index = 0; index < row.size(); index++) {

if (index == commentExtractField ||

index == contentExtractField ||

index == descriptionField) {

output.write(jsoupParse(row.get(index)).getBytes("UTF-8"));

}

else {

output.write(row.get(index).getBytes("UTF-8"));

}

String delimiter = "";

if (index == row.size() - 1) {

delimiter = "|nLa|";

}

else {

delimiter = "|nTa|";

}

output.write(delimiter.getBytes("UTF-8"));

}

}

output.finish();

output.close();

scanner.close();

gzipInputStream.close();

}

}

}

public static Long getTimestamp(File f) {

String name = f.getName();

String removeExt = name.substring(0, name.length() - 3);

String timestamp = removeExt.substring(7, removeExt.length());

return Long.parseLong(timestamp);

}

public static String jsoupParse(String s) {

if (s.length() == 4) {

return s;

}

else {

return Jsoup.parse(s).text();

}

}

}

我怎样才能确保当我完成对象时,它们被销毁并且不使用任何资源?例如,每次我关闭GZIPInputStream,GZIPOutputStream和Scanner时,我怎样才能确保它们被彻底销毁?

为了记录,我得到的错误是:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

at java.util.Arrays.copyOf(Arrays.java:2882)

at java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:100)

at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:572)

at java.lang.StringBuilder.append(StringBuilder.java:203)

at org.jsoup.parser.TokeniserState$47.read(TokeniserState.java:1171)

at org.jsoup.parser.Tokeniser.read(Tokeniser.java:42)

at org.jsoup.parser.TreeBuilder.runParser(TreeBuilder.java:101)

at org.jsoup.parser.TreeBuilder.parse(TreeBuilder.java:53)

at org.jsoup.parser.Parser.parse(Parser.java:24)

at org.jsoup.Jsoup.parse(Jsoup.java:44)

at ParseHTML.jsoupParse(ParseHTML.java:125)

at ParseHTML.main(ParseHTML.java:81)

java内存不足错误_调试Java内存不足错误相关推荐

  1. java项目----教务管理系统_基于Java的教务管理系统

    java项目----教务管理系统_基于Java的教务管理系统 2022-04-22 18:18·java基础 最近为客户开发了一套学校用教务管理系统,主要实现学生.课程.老师.选课等相关的信息化管理功 ...

  2. java 检测硬盘原理_深入Java核心 Java内存分配原理精讲

    Java内存分配与管理是Java的核心技术之一,一般Java在内存分配时会涉及到以下区域: ◆寄存器:我们在程序中无法控制 ◆栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中 ...

  3. linux运行java程序内存过大_排查java应用linux环境内存占用过高的问题

    一.问题场景 在一个短信平台的项目中,设置了一个下发节点的Xmx为16G,但是出现了内存撑满,导致CPU过高的情况.当时的具体情况是,该应用内存占用16G,该应用CPU占用1400%(16核),服务器 ...

  4. java强制编译通过_强制java使用用户输入作为消息进行编译错误

    我不知道在Java中是否可行: 我想从用户(从System.in)获得输入,然后使用该输入引发编译错误. 我的意思是,如果用户输入了文本" HELLO",则程序应引发编译错误:编译 ...

  5. java开发错误_每个Java开发人员都必须避免的9个安全错误

    java开发错误 Checkmarx CxSAST是功能强大的源代码分析(SCA)解决方案,旨在从根本上识别,跟踪和修复技术和逻辑安全漏洞:源代码. 在这里查看 ! 自从1995年中期引入Java以来 ...

  6. java jdk 未知错误_解决JAVA JDK安装出错的最常见问题,帮你排除困扰

    一般来说,安装JAVA JDK的整个流程是很简单的,只要按照提示进行操作即可,就不会出现问题.但是呢,有小伙伴反映说,之前安装了JAVA JDK,进行卸载重装的时候出现错误提示,"正在进行另 ...

  7. java ee开发环境_设置Java EE 6开发环境

    java ee开发环境 本教程简要说明了如何设置典型的环境来开发基于Java EE 6的应用程序. 除了可以正常工作的Windows XP客户端具有足够的CPU能力和内存外,本教程没有其他先决条件. ...

  8. java 不重启部署_编译Java类后不重启Tomcat有两种方式:热部署、热加载

    不重启Tomcat有两种方式:热部署.热加载 热部署:容器状况在运行时重新部署整个项目.这类环境下一般整个内存会清空,重新加载,这类方式 有可能会造成sessin丢失等环境.tomcat 6确实可以热 ...

  9. java 转储快照分析_分析Java核心转储

    java 转储快照分析 在本文中,我将向您展示如何调试Java核心文件,以查看导致JVM崩溃的原因. 我将使用在上一篇文章: 生成Java Core Dump中生成的核心文件. 您可以通过以下几种方法 ...

最新文章

  1. 华为手机所有图标变黑_华为官博科普手机状态栏小图标含义,总共分为4大类...
  2. Spring Annotation Processing: How It Works--转
  3. python图形设置_python学习笔记——基本图形绘制
  4. Java和Spring中线程池创建方法
  5. Pandas CookBook -- 04选取数据子集
  6. Servlet 客户端 HTTP 请求
  7. Logistic逻辑回归用初等数学解读逻辑回归
  8. apollo配置中心搭建
  9. ideal如何用标签输出_实战|如何使用JavaScript访问设备前后摄像头
  10. vue + element ui 阻止表单输入框回车刷新页面
  11. python爬取别人qq空间相册_python+selenium+requests爬取qq空间相册时遇到的问题及解决思路...
  12. Linux7安装oracle11g报错 Error in invoking target 'agen
  13. 芯片流片(晶圆制造)工艺服务的流程。 细节详解连载
  14. 物联网行业如何迎风飞扬
  15. 1.12 DICOM彩色图像
  16. python3.7 win10 64位系统下用pyinstaller打包的程序在32位系统下无法运行
  17. NR协议学习——RLC
  18. npm run build报错Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of
  19. 2018秋招求职地图 | 教你如何打造重量级求职敲门砖
  20. 燕十八 mysql_燕十八mysql笔记

热门文章

  1. android js 开屏动画,利用Flutter实现“孔雀开屏”的动画效果
  2. 查看mysql连接数_查看mysql 连接数
  3. 2019年,瑞云渲染做了这些事……
  4. 消息中间件学习总结(4)——RocketMQ之RocketMQ 迈入50万TPS消息俱乐部
  5. Tomcat学习总结(14)—— Tomcat常见面试题
  6. mysql创建数据表代码_MYSQL 简单的建库操作代码
  7. python萌新:从零基础入门到放弃
  8. 二叉树的几种遍历方法
  9. 运行时动态的开关 Spring Security
  10. 洛谷 P2495 [SDOI2011]消耗战