Java类加载之MetaIndex

MetaIndex旨在为jar文件中的探针提供快速拒绝机制,减少启动时间。元索引磁盘表示为扁平文本文件,设计上包含多jar条目以减少磁盘访问,仅作快速拒绝,尽可能小,版本化且可选。还介绍了标记jar文件规则及JDK中实现要求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MetaIndex旨在通过为jar文件中的探针提供快速拒绝机制来减少启动时间(特别是冷启动,当文件尚未进入磁盘缓存时)。元索引的磁盘表示是一个扁平文本文件,每个jar条目指示(一般来说)jar中包含的包名称的前缀。

关于元索引设计的一些注意事项:

  • 它包含多个jar文件的条目。这是故意的,以减少启动期间需要执行的磁盘访问次数。
  • 它仅用作快速拒绝机制,以防止应用程序和其他类强制打开引导和扩展类路径上的所有jar文件。它不是用作罐子内容物的精确指数。
  • 它应该尽可能小,以减少在启动期间解析它所需的时间。例如,将辅助包元素添加到java /和javax / packages(例如“javax / swing /”)会导致元索引显着增长。这就是为什么选择包的子串作为主要内容的原因。
  • 它是版本化的,也是可选的,以防止JVM和JDK之间存在强大的依赖关系。它还可能不仅适用于引导和扩展类路径。
  • 准确地说,它在JVM和J2SE方面扮演着不同的角色。在JVM端,元索引文件仅用于加速定位类文件,而在J2SE端,元索引文件用于加速资源文件和类文件。

为了帮助JVM和J2SE代码更好地利用元索引文件中的信息,我们以不同的方式标记jar文件。这是我们使用的当前规则。

  1. 对于仅包含类文件的jar文件,我们输入’!'在jar文件名之前;
  2. 对于只包含资源文件的jar文件,我们在jar文件名前加上’@’;
  3. 对于包含资源和类文件的jar文件,我们在jar名称前加上’#’。

请注意,每个jar文件至少包含清单文件,因此当我们说“只包含类文件的jar文件”时,我们不包含该文件。

为了避免更改当前应用程序加载器和其他加载器的行为,JDK中的当前MetaIndex实现要求在构造关联的URLClassPath之前将包含元索引的目录注册到MetaIndex类。这样就无需自动搜索URLClassPath代码中的元索引以及非核心类加载器的行为可能发生的变化。
此类依赖于build.tools.buildmetaindex.BuildMetaIndex.java (make / tools / MetaIndex / BuildMetaIndex.java) ,主要由sun.misc.URLClassPath使用。

%JRE_HOME%\lib\meta-index

% VERSION 2
% WARNING: this file is auto-generated; do not edit
% UNSUPPORTED: this file and its format may change and/or
%   may be removed in a future release
# charsets.jar
sun/nio
sun/awt
# jce.jar
javax/crypto
sun/security
META-INF/ORACLE_J.RSA
META-INF/ORACLE_J.SF
# jfr.jar
oracle/jrockit/
jdk/jfr
com/oracle/jrockit/
! jsse.jar
sun/security
com/sun/net/
! management-agent.jar
@ resources.jar
com/sun/java/util/jar/pack/
META-INF/services/sun.util.spi.XmlPropertiesProvider
META-INF/services/javax.print.PrintServiceLookup
com/sun/corba/
META-INF/services/javax.sound.midi.spi.SoundbankReader
sun/print
META-INF/services/javax.sound.midi.spi.MidiFileReader
META-INF/services/sun.java2d.cmm.CMMServiceProvider
javax/swing
META-INF/services/javax.sound.sampled.spi.AudioFileReader
META-INF/services/javax.sound.midi.spi.MidiDeviceProvider
sun/net
META-INF/services/javax.sound.sampled.spi.AudioFileWriter
com/sun/imageio/
META-INF/services/sun.java2d.pipe.RenderingEngine
META-INF/mimetypes.default
META-INF/services/javax.sound.midi.spi.MidiFileWriter
sun/rmi
javax/sql
META-INF/services/com.sun.tools.internal.ws.wscompile.Plugin
com/sun/rowset/
META-INF/services/javax.print.StreamPrintServiceFactory
META-INF/mailcap.default
java/lang
sun/text
javax/xml
META-INF/services/javax.sound.sampled.spi.MixerProvider
com/sun/xml/
META-INF/services/com.sun.tools.internal.xjc.Plugin
com/sun/java/swing/
com/sun/jndi/
com/sun/org/
META-INF/services/javax.sound.sampled.spi.FormatConversionProvider
! rt.jar
com/sun/java/util/jar/pack/
java/
org/ietf/
com/sun/beans/
com/sun/tracing/
com/sun/java/browser/
com/sun/corba/
com/sun/media/
com/sun/awt/
com/sun/management/
sun/
com/sun/jmx/
com/sun/demo/
com/sun/imageio/
com/sun/net/
com/sun/rmi/
org/w3c/
com/sun/swing/
com/sun/activation/
com/sun/nio/
com/sun/rowset/
org/jcp/
com/sun/istack/
jdk/
com/sun/naming/
org/xml/
org/omg/
com/sun/security/
com/sun/image/
com/sun/xml/
com/sun/java/swing/
com/oracle/
com/sun/java_cup/
com/sun/jndi/
com/sun/accessibility/
com/sun/org/
javax/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值