Java 我的价值。@DanielWiddis,我真的很快就把这堆东西吃掉了,这是真的。由于在同一个JVM实例上运行着其他任务,因此这将分解为大约600-800万行。所以调用System.gc()不是回收内存的保证—这是该任务生成CSV所需的保证。字符串真的会留在堆

Java 我的价值。@DanielWiddis,我真的很快就把这堆东西吃掉了,这是真的。由于在同一个JVM实例上运行着其他任务,因此这将分解为大约600-800万行。所以调用System.gc()不是回收内存的保证—这是该任务生成CSV所需的保证。字符串真的会留在堆,java,jvm,java-native-interface,jna,Java,Jvm,Java Native Interface,Jna,我的价值。@DanielWiddis,我真的很快就把这堆东西吃掉了,这是真的。由于在同一个JVM实例上运行着其他任务,因此这将分解为大约600-800万行。所以调用System.gc()不是回收内存的保证—这是该任务生成CSV所需的保证。字符串真的会留在堆中吗?在循环外部声明变量,并在内部重新签名。“old”字符串将立即可用于垃圾收集,因为它没有对它的活动引用。您的问题不主要是rowsetextractor构建了一个包含5000万行的列表,然后按顺序处理它吗?RowCallBackHandler


我的价值。@DanielWiddis,我真的很快就把这堆东西吃掉了,这是真的。由于在同一个JVM实例上运行着其他任务,因此这将分解为大约600-800万行。所以调用
System.gc()
不是回收内存的保证—这是该任务生成CSV所需的保证。字符串真的会留在堆中吗?在循环外部声明变量,并在内部重新签名。“old”字符串将立即可用于垃圾收集,因为它没有对它的活动引用。您的问题不主要是rowsetextractor构建了一个包含5000万行的列表,然后按顺序处理它吗?RowCallBackHandler将处理从te resultset返回的每一行
jdbcTemplate.query(new CustomPreparedStatementCreator(arg), new ResultSetExtractor<Void>() {
    @Override
    public Void extractData(ResultSet rs) {
    while (rs.next()) {
        // transform each row's data (involves creation of objects)
        // write the transformed strings to csv file
    }
}