我想知道Java编写的程序何时运行,它的类将全部加载到主内存中?

时间:2012-08-21 15:06:08

标签: java eclipse

当用Java编写的程序运行时,它的所有类是否都会被加载到主内存中?如果是这样,是不是浪费了RAM?

2 个答案:

答案 0 :(得分:6)

不行,因为虚拟地址空间和虚拟内存。阅读这些:

http://en.wikipedia.org/wiki/Virtual_memory

http://en.wikipedia.org/wiki/Virtual_address_space

虚拟内存意味着您可以将大量内容加载到内存中,未使用的部分将保存到光盘中并从物理RAM中移出。

虚拟地址空间意味着每个进程(进程的一个示例是您的Java程序)都有自己的地址空间,因此它不会“窃取”其他进程的地址。

答案 1 :(得分:2)

仅加载特定执行期间引用的类。大多数大型Java程序经常会运行许多未加载的类,因为这些类服务于特定进程未执行的各种场景。

标准库中的类的处理方式与应用程序类相同。例如,如果您的应用程序不引用AWT,则不会加载AWT包中的类。

Java语言规范包含明确排除了类的急切初始化的措辞。

JLS Section 12.4

  

类或接口类型T将是   在此之前立即初始化   第一次出现任何一个   以下内容:

     
      
  • T是一个类,T的实例是   创建。
  •   
  • T是一个类和一个静态   调用T声明的方法。
  •   
  • 甲   T声明的静态字段是   分配
  •   
  • T声明的静态字段   使用,字段不是   常数变量(§4.12.4)。
  •   
  • T是一个   顶级类和断言   声明(§14.10)词汇嵌套
  •   

请注意我使用术语“初始化”。在解析定义类的二进制数据时,类被初始化为构造Class对象的一部分。

没有什么能阻止特定的ClassLoader实现将它看到的所有类的二进制文件加载到内存中,但是在请求它们之前它们不能完全加载这些类而不违反JLS。

有关常见的ClassLoader实现,请参阅URLClassLoader。