Java 如何为JRE 1.6创建rt.jar?

Java 如何为JRE 1.6创建rt.jar?,java,Java,这就是我所做的- 我将rt.jar的内容解压缩到一个名为rt的文件夹中 jar cf rt.jar * 这将创建一个jar文件,其类与原始rt.jar文件中的类相同 但是,这两个文件的文件大小明显不同 Original rt.jar -> 43.1 MB Newly created rt.jar -> 20.6 MB 请注意,两个jar文件的解压缩内容大小相同。这让我觉得原来的rt.jar不是使用jar命令创建的。那么它是如何创建的呢?它可能是通过jar命令的-0选项创

这就是我所做的-

我将rt.jar的内容解压缩到一个名为rt的文件夹中

jar cf rt.jar *
这将创建一个jar文件,其类与原始rt.jar文件中的类相同

但是,这两个文件的文件大小明显不同

Original rt.jar      -> 43.1 MB
Newly created rt.jar -> 20.6 MB

请注意,两个jar文件的解压缩内容大小相同。这让我觉得原来的rt.jar不是使用jar命令创建的。那么它是如何创建的呢?

它可能是通过jar命令的
-0
选项创建的,该命令不应用ZIP压缩,只存储文件

由于此归档文件将被大量读取,并且按照现代标准,它非常小,因此为了23MB的内存,减少运行时开销似乎是值得的


(在任何情况下,即使这不是严格正确的,文件大小的差异也将取决于不同的压缩级别。)

原始jar是以0压缩级别创建的,以减少加载类的CPU密集度

> unzip -v rt.jar
Archive:  rt.jar
 Length   Method    Size  Cmpr    Date    Time   CRC-32   Name
--------  ------  ------- ---- ---------- ----- --------  ----
       0  Stored        0   0% 02-03-2012 21:20 00000000  META-INF/
    2343  Stored     2343   0% 02-03-2012 21:20 a653ef50  META-INF/MANIFEST.MF
     754  Stored      754   0% 02-03-2012 21:12 fa8ba6d9  com/oracle/net/Sdp$1.class
     350  Stored      350   0% 02-03-2012 21:12 ca729c09  com/oracle/net/Sdp$SdpSocket.class
...

我猜
rt.jar
可能未压缩地存储其内容(出于性能原因)。我将尝试解释如何加载类如果未压缩,则在内容未压缩时,rt.jar可以映射到内存。在C语言中,这与正确加载它完全一样,但不需要额外的努力。对于只读映射,操作系统甚至可以共享加载的页面。总的来说,它应该比解压和为每个类分配额外内存更快。是的!我用-0选项检查了它。文件大小现在相同!回答得好!