![]() |
1
34
导入与编译代码中的任何指令都不相关。它们建立了仅在编译时使用的别名。 有一些反射方法允许加载类但尚未初始化,但在大多数情况下,您可以假设每当引用一个类时,它都已初始化。 静态成员初始化器和静态块被执行,就像它们在源代码顺序中都是一个静态初始化器块一样。
通过静态成员变量引用的对象将被强引用,直到类被卸载。一个正常的
作为(附带的)奖励,这里有一个棘手的问题需要考虑:
此代码将打印什么?试试看,你会看到它打印出“6”。这里有几件事在起作用,其中之一是静态初始化的顺序。代码的执行方式就像它是这样编写的:
|
![]() |
2
5
通常不存在所谓的“静态”记忆。大多数虚拟机都有永久生成的堆(类加载的地方),通常不会进行垃圾回收。 静态对象与任何其他对象一样被分配。但是,如果它们活得很长,它们将在垃圾收集器中的不同世代之间移动。但它们最终不会进入两性空间。 如果你的类永久地持有这个对象,那么只有当vm退出时,它才会被释放。 |
![]() |
3
3
此静态变量 某人0 一旦你的类在代码中被引用,它就会被初始化。在您的示例中,这将在main方法的第一行执行。 您可以通过创建静态初始化器块来验证这一点。在这个初始化器块中放置一个断点,您将看到它何时被调用。或者更简单。..在SomeObject的构造函数中设置断点。 |
![]() |
4
3
静态变量的初始化在第节中介绍 2.11 Static Initializers 然而,该规范没有定义垃圾收集的实现,因此我认为静态对象的垃圾收集规则会因VM而异。 |
![]() |
5
2
应该注意的是,只有指针(或任何其他基元类型)存储在 PermGenSpace (这是存储静态内容的区域的正确名称)。 因此,指针引用的对象和其他对象一样位于正常堆中。 |
![]() |
6
0
如果静态字段被更改为引用不同的对象,则静态字段指向的原始对象与任何其他对象一样有资格进行GC。 如果类本身被卸载并且整个对象图被从堆中剪切,它也可以被释放(即使没有为空)。当然,当一个类可以卸载时,对于许多其他问题来说是一个很好的话题。.. :) |
|
user29759326 · 如何返回递归函数中的最后一个值? 6 月前 |
|
malife89 · 将java中的字符串读取为正确的日期格式 6 月前 |
![]() |
Tim · 在java中,有没有更快的方法将字节数组写入文件? 6 月前 |
![]() |
rudraraj · java中未声明最终变量 6 月前 |
![]() |
Bala Ji · 以下BFS的实施效率如何? 7 月前 |