Skip to content

Commit f696d9c

Browse files
committed
8346239: Improve memory efficiency of JimageDiffGenerator
Reviewed-by: mbaesken
1 parent cbabc04 commit f696d9c

16 files changed

+74
-20
lines changed

src/jdk.jlink/share/classes/jdk/tools/jlink/internal/runtimelink/JimageDiffGenerator.java

Lines changed: 54 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@
2424
*/
2525
package jdk.tools.jlink.internal.runtimelink;
2626

27+
import java.io.IOException;
28+
import java.io.InputStream;
29+
import java.io.UncheckedIOException;
2730
import java.util.ArrayList;
2831
import java.util.Arrays;
2932
import java.util.HashSet;
@@ -49,6 +52,7 @@ public class JimageDiffGenerator {
4952
public interface ImageResource extends AutoCloseable {
5053
public List<String> getEntries();
5154
public byte[] getResourceBytes(String name);
55+
public InputStream getResource(String name);
5256
}
5357

5458
/**
@@ -71,7 +75,6 @@ public List<ResourceDiff> generateDiff(ImageResource base, ImageResource image)
7175
resources.addAll(image.getEntries());
7276
baseResources = base.getEntries();
7377
for (String item: baseResources) {
74-
byte[] baseBytes = base.getResourceBytes(item);
7578
// First check that every item in the base image exist in
7679
// the optimized image as well. If it does not, it's a removed
7780
// item in the optimized image.
@@ -82,19 +85,18 @@ public List<ResourceDiff> generateDiff(ImageResource base, ImageResource image)
8285
ResourceDiff.Builder builder = new ResourceDiff.Builder();
8386
ResourceDiff diff = builder.setKind(ResourceDiff.Kind.REMOVED)
8487
.setName(item)
85-
.setResourceBytes(baseBytes)
88+
.setResourceBytes(base.getResourceBytes(item))
8689
.build();
8790
diffs.add(diff);
8891
continue;
8992
}
9093
// Verify resource bytes are equal if present in both images
91-
boolean contentEquals = Arrays.equals(baseBytes, image.getResourceBytes(item));
92-
if (!contentEquals) {
94+
if (!compareStreams(base.getResource(item), image.getResource(item))) {
9395
// keep track of original bytes (non-optimized)
9496
ResourceDiff.Builder builder = new ResourceDiff.Builder();
9597
ResourceDiff diff = builder.setKind(ResourceDiff.Kind.MODIFIED)
9698
.setName(item)
97-
.setResourceBytes(baseBytes)
99+
.setResourceBytes(base.getResourceBytes(item))
98100
.build();
99101
diffs.add(diff);
100102
}
@@ -112,4 +114,51 @@ public List<ResourceDiff> generateDiff(ImageResource base, ImageResource image)
112114
return diffs;
113115
}
114116

117+
/**
118+
* Compare the contents of the two input streams (byte-by-byte).
119+
*
120+
* @param is1 The first input stream
121+
* @param is2 The second input stream
122+
* @return {@code true} iff the two streams contain the same number of
123+
* bytes and each byte of the streams are equal. {@code false}
124+
* otherwise.
125+
*/
126+
private boolean compareStreams(InputStream is1, InputStream is2) {
127+
byte[] buf1 = new byte[1024];
128+
byte[] buf2 = new byte[1024];
129+
int bytesRead1, bytesRead2 = 0;
130+
try {
131+
try (is1; is2) {
132+
while ((bytesRead1 = is1.read(buf1)) != -1 &&
133+
(bytesRead2 = is2.read(buf2)) != -1) {
134+
if (bytesRead1 != bytesRead2) {
135+
return false;
136+
}
137+
if (bytesRead1 == buf1.length) {
138+
if (!Arrays.equals(buf1, buf2)) {
139+
return false;
140+
}
141+
} else {
142+
for (int i = 0; i < bytesRead1; i++) {
143+
if (buf1[i] != buf2[i]) {
144+
return false;
145+
}
146+
}
147+
}
148+
}
149+
// ensure we read both to the end
150+
if (bytesRead1 == -1) {
151+
bytesRead2 = is2.read(buf2);
152+
if (bytesRead2 != -1) {
153+
return false;
154+
}
155+
return true;
156+
}
157+
}
158+
} catch (IOException e) {
159+
throw new UncheckedIOException("IO exception when comparing bytes", e);
160+
}
161+
return false;
162+
}
163+
115164
}

src/jdk.jlink/share/classes/jdk/tools/jlink/internal/runtimelink/ResourcePoolReader.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525

2626
package jdk.tools.jlink.internal.runtimelink;
2727

28+
import java.io.InputStream;
2829
import java.util.List;
2930
import java.util.Objects;
3031

@@ -56,4 +57,9 @@ public byte[] getResourceBytes(String name) {
5657
return pool.findEntry(name).orElseThrow().contentBytes();
5758
}
5859

60+
@Override
61+
public InputStream getResource(String name) {
62+
return pool.findEntry(name).orElseThrow().content();
63+
}
64+
5965
}

test/jdk/tools/jlink/runtimeImage/AddOptionsTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040
* jdk.jlink/jdk.tools.jimage
4141
* @build tests.* jdk.test.lib.process.OutputAnalyzer
4242
* jdk.test.lib.process.ProcessTools
43-
* @run main/othervm -Xmx1400m AddOptionsTest
43+
* @run main/othervm -Xmx1g AddOptionsTest
4444
*/
4545
public class AddOptionsTest extends AbstractLinkableRuntimeTest {
4646

test/jdk/tools/jlink/runtimeImage/BasicJlinkMissingJavaBase.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@
4141
* jdk.jlink/jdk.tools.jimage
4242
* @build tests.* jdk.test.lib.process.OutputAnalyzer
4343
* jdk.test.lib.process.ProcessTools
44-
* @run main/othervm -Xmx1400m BasicJlinkMissingJavaBase
44+
* @run main/othervm -Xmx1g BasicJlinkMissingJavaBase
4545
*/
4646
public class BasicJlinkMissingJavaBase extends AbstractLinkableRuntimeTest {
4747

test/jdk/tools/jlink/runtimeImage/BasicJlinkTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939
* jdk.jlink/jdk.tools.jimage
4040
* @build tests.* jdk.test.lib.process.OutputAnalyzer
4141
* jdk.test.lib.process.ProcessTools
42-
* @run main/othervm -Xmx1400m BasicJlinkTest false
42+
* @run main/othervm -Xmx1g BasicJlinkTest false
4343
*/
4444
public class BasicJlinkTest extends AbstractLinkableRuntimeTest {
4545

test/jdk/tools/jlink/runtimeImage/CustomModuleJlinkTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939
* jdk.jlink/jdk.tools.jimage
4040
* @build tests.* jdk.test.lib.process.OutputAnalyzer
4141
* jdk.test.lib.process.ProcessTools
42-
* @run main/othervm -Xmx1400m CustomModuleJlinkTest
42+
* @run main/othervm -Xmx1g CustomModuleJlinkTest
4343
*/
4444
public class CustomModuleJlinkTest extends AbstractLinkableRuntimeTest {
4545

test/jdk/tools/jlink/runtimeImage/GenerateJLIClassesTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939
* jdk.jlink/jdk.tools.jimage
4040
* @build tests.* jdk.test.lib.process.OutputAnalyzer
4141
* jdk.test.lib.process.ProcessTools
42-
* @run main/othervm -Xmx1400m GenerateJLIClassesTest
42+
* @run main/othervm -Xmx1g GenerateJLIClassesTest
4343
*/
4444
public class GenerateJLIClassesTest extends AbstractLinkableRuntimeTest {
4545

test/jdk/tools/jlink/runtimeImage/JavaSEReproducibleTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040
* jdk.jlink/jdk.tools.jimage
4141
* @build tests.* jdk.test.lib.process.OutputAnalyzer
4242
* jdk.test.lib.process.ProcessTools
43-
* @run main/othervm -Xmx1400m JavaSEReproducibleTest
43+
* @run main/othervm -Xmx1g JavaSEReproducibleTest
4444
*/
4545
public class JavaSEReproducibleTest extends AbstractLinkableRuntimeTest {
4646

test/jdk/tools/jlink/runtimeImage/KeepPackagedModulesFailTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@
4141
* jdk.jlink/jdk.tools.jimage
4242
* @build tests.* jdk.test.lib.process.OutputAnalyzer
4343
* jdk.test.lib.process.ProcessTools
44-
* @run main/othervm -Xmx1400m KeepPackagedModulesFailTest
44+
* @run main/othervm -Xmx1g KeepPackagedModulesFailTest
4545
*/
4646
public class KeepPackagedModulesFailTest extends AbstractLinkableRuntimeTest {
4747

test/jdk/tools/jlink/runtimeImage/ModifiedFilesExitTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040
* jdk.jlink/jdk.tools.jimage
4141
* @build tests.* jdk.test.lib.process.OutputAnalyzer
4242
* jdk.test.lib.process.ProcessTools
43-
* @run main/othervm -Xmx1400m ModifiedFilesExitTest
43+
* @run main/othervm -Xmx1g ModifiedFilesExitTest
4444
*/
4545
public class ModifiedFilesExitTest extends ModifiedFilesTest {
4646

0 commit comments

Comments
 (0)