2015-02-11 45 views
4

我对Java类加载的理解是它的懒加载。因此,如果你有一堆Java应用程序附带的未使用的jar文件,它们只会浪费磁盘空间而不会真正消耗内存。然而,它似乎暗示在各种Oracle博客/文档中,压缩配置文件实际上会减少内存占用(herehere)。Java Compact配置文件实际上会减少内存占用量吗?

为了使一个简单的yes或no的问题,是不是主观的:

如果我做一个“世界,你好!” Java应用程序(即仅使用System.out)在通过compact1配置文件运行时实际上是否具有较小的运行时内存占用量,而不是完整的SE?(我会自己测试,但编译紧凑配置文件时遇到问题)。

+0

是的。使用简洁的配置文件,整个JRE不会被加载到内存中。只有所需的运行时间库被加载到内存中。当应用程序类被延迟加载时,当JRE启动时,JRE类将被加载到内存中。 – 2015-02-11 18:05:19

+0

圣洁的废话!因此,基本上'rt.jar'中的所有内容都会被加载,无论它是否被使用?所以它只是将所有这些类加载到内存中,包括corba和rmi废话?这只是特定于'rt.jar'吗?他们为什么要这样做?预加载性能更好吗?你有一个链接,说rt.jar完全加载到init? – 2015-02-11 18:09:51

+0

你必须问Oracle(或Sun)为什么。作为一个例子,我怀疑这个决定是增加启动时间,而不是让应用程序停止并等待加载corba类。个人电脑的内存在1995年便宜而丰富。智能手机已经有十年的时间了。 – 2015-02-11 18:13:51

回答

0

还有为三个紧凑的轮廓,根据documentation:(。*的java.lang)

档案compact1负荷核心,安全性,系列化,网络,参考对象,正则表达式,日期和时间,输入/输出,类别,记录,并发,反射,JAR,ZIP,版本,国际化,JNI,覆盖机制,扩展机制,脚本

资料紧凑2增加 JDBC,RMI,XML,JAXP

简介紧凑型3增加安全(Kerberos的,ACL和SASL),JMX,JNDI,XML JAXP2,管理,规范

这些配置可以通过量的javac-profile选项被激活。也

注意System.out是根据documentation自举类的一部分:

自举类是实现Java 2平台的类。 引导程序类位于jrt/lib目录中的rt.jar和其他几个jar文件中。

,这可能interssed你

这是非常不可能的,你将需要重新定义引导类 路径。非标准选项-Xbootclasspath允许您在 中这样做,在这种情况下必须使用不同的 核心类。

所以在最后,使用compact1简档回答您的具体问题将在运行时的“Hello world”,因为System.out是自举类,但使用-Xbootclasspath也许可以不给你一个更小的内存占用把戏。

0

是的,紧凑的配置文件将减少内存占用。

在JVM启动几件事情发生:加载到内存

  • 本地库
  • rt.jar中加载到内存中
  • 引用的库加载到,只有当他们实际使用的内存

不同的紧凑型材包括不同的技术组合。从而将加载的对象的数量减少到内存中。你可以查阅一下使用命令恰好加载到内存:

pmap <jvm pid> 

我与轮廓compact1和默认堆大小我得为12Mb树莓派。