Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 静态变量的实际内存位置是什么?_Java_Memory_Memory Management_Garbage Collection - Fatal编程技术网

Java 静态变量的实际内存位置是什么?

Java 静态变量的实际内存位置是什么?,java,memory,memory-management,garbage-collection,Java,Memory,Memory Management,Garbage Collection,静态变量在程序执行的整个过程中分配,因此 也不方便。那么变量在哪里?是否应该在某个地方加载它?从: 静态变量的内存已分配 在节目开始时,在 常规内存,而不是堆栈 (专用于存储的内存) 程序)。这样做的好处是 它使您的变量或 程序完全不变,你呢 不能意外更改该值。 这样做的缺点是 直到 程序终止。我从来没有 听说过静态值的任何东西吗 有没有比它们更大的内存 定期声明,但他们的记忆 使用始终不变 静态变量是在程序执行的整个过程中分配的,所以堆栈和堆都不适合它 实际上,静态帧(即保存静态变量的帧)是从

静态变量在程序执行的整个过程中分配,因此 也不方便。那么变量在哪里?是否应该在某个地方加载它?

从:

静态变量的内存已分配 在节目开始时,在 常规内存,而不是堆栈 (专用于存储的内存) 程序)。这样做的好处是 它使您的变量或 程序完全不变,你呢 不能意外更改该值。 这样做的缺点是 直到 程序终止。我从来没有 听说过静态值的任何东西吗 有没有比它们更大的内存 定期声明,但他们的记忆 使用始终不变

静态变量是在程序执行的整个过程中分配的,所以堆栈和堆都不适合它

实际上,静态帧(即保存静态变量的帧)是从堆中分配的


而且它们在程序执行期间不一定存在。例如,如果父类加载器、所有类和所有实例变得不可访问,则可以对动态加载的类的静态帧进行垃圾收集。

在加载类时初始化静态字段,在卸载该类的类加载器时丢弃静态字段。它们可以被清理,甚至可以在另一个类装入器中复制

对于像那些使用OSGi的应用程序,静态变量不会在应用程序的整个生命周期中存在。它们可以多次重新加载


这一实现方式可能依赖于JVM,但Sun/Oracle JVM创建了一个“对象”来保存类的静态字段。此对象可通过不安全类访问,该类也可用于检查此“对象”字段。

我们的内存中有3段:

  • 堆栈段-包含局部变量和引用变量(保存堆中对象地址的变量)

  • 堆段-包含运行时中创建的所有对象,仅包含对象及其对象属性(实例变量)

  • 代码段—加载时实际编译的Java字节码所在的段。 静态成员(变量或方法)称为类成员,这意味着它们驻留在类(字节码)驻留的地方,即代码段中


  • JVM使用的五个内存区域中,当应用程序类加载器在准备和加载阶段加载类时,静态字段在类区域(PremGen的一部分)中分配内存。 如果字段是基本字段,则值存储在类区域中,如果它是对象类型(使用新运算符),则存储在堆中,但引用给类区域中指定的静态字段变量。 卸载该类时,该静态字段的内存也可由GC进行垃圾收集


    如果字段也是final,即static final,则它将保存在类区域下的常量池中。

    静态变量由存储代码的同一内存段(即类区域)中的内存提供。它独立于内存的堆栈或堆段。在整个课程期间,它仍然可以访问

    另见:@mnicky谢谢!!!它很有用。可能重复-1:“完全恒定”?你在考虑期末考试吗?直到最后才释放内存;这不是一个缺点,这就是
    静态的全部要点@OliCharlesworth,他说的是
    静态final
    变量。和被迫使用更长的内存相比,这是一个劣势,而不是不必这么做。这个答案已经被投票了这么多,但与Sourav矛盾,你能给出你的来源吗?也许SoaVAV是指C++?