diff --git a/WHATSNEW b/WHATSNEW index 28234e67c..ec15d11df 100644 --- a/WHATSNEW +++ b/WHATSNEW @@ -17,6 +17,11 @@ Changes that could break older environments: Fixed bugs: ----------- + * The Sun JVM tries to mmap the entire file during a copy. + For large files this is not feasible. + We now explicitly request to copy at most 16 MiB per request. + Bugzilla Report 49326. + * DemuxInputStream.read() should return unsigned values Bugzilla Report 49279. diff --git a/src/main/org/apache/tools/ant/util/ResourceUtils.java b/src/main/org/apache/tools/ant/util/ResourceUtils.java index c7ce29b4b..cdcd724aa 100644 --- a/src/main/org/apache/tools/ant/util/ResourceUtils.java +++ b/src/main/org/apache/tools/ant/util/ResourceUtils.java @@ -72,6 +72,8 @@ public class ResourceUtils { */ public static final String ISO_8859_1 = "ISO-8859-1"; + private static final long MAX_IO_CHUNCK_SIZE = 16*1024*1024; // 16 MB + /** * Tells which source files should be reprocessed based on the * last modification date of target files. @@ -526,8 +528,9 @@ public class ResourceUtils { long position = 0; long count = srcChannel.size(); while (position < count) { + long chunck = Math.min(MAX_IO_CHUNCK_SIZE, count - position); position += - srcChannel.transferTo(position, count - position, + srcChannel.transferTo(position, chunck, destChannel); } } finally {