正如标题所述,为什么OpenJDK JVM不会在Windows x86上发出预取指令?请参阅OpenJDK Mercurial @http://hg.openjdk.java.net/jdk8u/jdk8u/hotspot/file/c49dcaf78a65/src/os_cpu/windows_x86/vm/prefetch_windows_x86.inline.hpp
inline void Prefetch::read (void *loc, intx interval) {}
inline void Prefetch::write(void *loc, intx interval) {}
Run Code Online (Sandbox Code Playgroud)
没有评论,我发现除了源代码之外没有其他资源.我问,因为它对Linux x86这样做,请参阅http://hg.openjdk.java.net/jdk8u/jdk8u/hotspot/file/c49dcaf78a65/src/os_cpu/linux_x86/vm/prefetch_linux_x86.inline.hpp
inline void Prefetch::read (void *loc, intx interval) {
#ifdef AMD64
__asm__ ("prefetcht0 (%0,%1,1)" : : "r" (loc), "r" (interval));
#endif // AMD64
}
inline void Prefetch::write(void *loc, intx interval) {
#ifdef AMD64
// Do not use the 3dnow prefetchw instruction. It isn't supported on em64t.
// __asm__ ("prefetchw (%0,%1,1)" : : "r" (loc), "r" (interval));
__asm__ …Run Code Online (Sandbox Code Playgroud) Java-Spec保证将给定的lamda定义(例如() -> "Hello World")编译/转换为仅一个实现类(每个定义,并非每个“看起来”都相同的事件)。
有什么方法可以强制java-compiler / jvm生成新的lamda定义,而不是共享一个通用的lamda定义?我目前正在实现一个将多个功能部件编织到BiFunction中的库,该库由于Java-spec提供的保证而遭受了大形调用站点的困扰(编辑:我已纠正:Java-Spec不保证单个共享class-当前的参考实现会执行此操作):
public <In, Out, A> BiFunction<In, Out, Out> weave(
Function<? super In, A> getter,
BiConsumer<? super Out, ? super A> consumer
) {
return (in, out) -> {
consumer.accept(out, getter.apply(in));
return out;
};
}
Run Code Online (Sandbox Code Playgroud)
通过此代码生成的每个lamda都共享相同的lamda定义,因此大多是不可内联的/不可优化的。
我们正在通过 Gitlab Pipeline Jobs 将 Gradle 缓存作为 ZIP 上传到 S3。解压其中一个 ZIP 文件(仅包含该.gradle文件夹)表明,许多依赖项多次包含完全相同的版本:1x injars-9和 1x in modules-2:

为什么会发生这种情况以及如何避免这种情况?因此,我们的 CI 缓存比实际需要的大 20-30%,特别是对于像 Kotlin 编译器这样的大依赖项:

JAR 之间的大小差异可归因于 JAR 文件压缩打开或关闭,它们在内容方面是相同的。
关于文件夹结构的官方解释没有.gradle帮助。