当用Java编写的程序运行时,它的所有类是否都会被加载到主内存中?如果是这样,是不是浪费了RAM?
答案 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语言规范包含明确排除了类的急切初始化的措辞。
类或接口类型T将是 在此之前立即初始化 第一次出现任何一个 以下内容:
- T是一个类,T的实例是 创建。
- T是一个类和一个静态 调用T声明的方法。
- 甲 T声明的静态字段是 分配
- T声明的静态字段 使用,字段不是 常数变量(§4.12.4)。
- T是一个 顶级类和断言 声明(§14.10)词汇嵌套
请注意我使用术语“初始化”。在解析定义类的二进制数据时,类被初始化为构造Class对象的一部分。
没有什么能阻止特定的ClassLoader实现将它看到的所有类的二进制文件加载到内存中,但是在请求它们之前它们不能完全加载这些类而不违反JLS。
有关常见的ClassLoader实现,请参阅URLClassLoader。