精华内容
下载资源
问答
  • 主要介绍了spring boot静态变量注入配置文件的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 茅侃侃静态方法(实际上所有方法)以及静态变量都存储在PermGen部分,因为它们是反射数据的一部分(类相关数据,而不是与实例相关的)。需要澄清的最新情况:注意,只有变量及其技术值(原语或引用)存储在PermGen空间中。...

    8ccaa06752fcc4cefb3799efe3448600.png

    茅侃侃

    静态方法(实际上所有方法)以及静态变量都存储在PermGen部分,因为它们是反射数据的一部分(类相关数据,而不是与实例相关的)。需要澄清的最新情况:注意,只有变量及其技术值(原语或引用)存储在PermGen空间中。如果静态变量是对象的引用,则该对象本身存储在堆的正常部分(年轻/旧代或幸存者空间)。这些对象(除非它们是类等内部对象)是不存储在PermGen空间。例子:static int i = 1; //the value 1 is stored in the PermGen sectionstatic Object o = new SomeObject(); //the reference(pointer/memory address) is stored in the PermGen section, the object itself is not.一个关于垃圾收集的词:做不倚靠finalize()因为它不一定会跑。这完全取决于JVM何时运行垃圾收集器和收集什么,即使一个对象符合垃圾收集的条件。当然,您可以将静态变量设置为NULL,从而删除对堆上对象的引用,但这并不意味着垃圾回收器将要收集它(即使没有更多的参考资料)。另外finalize()只运行一次,因此您必须确保它不会引发异常或以其他方式阻止对象被收集。如果您通过某些异常停止了终结,finalize()不会再次在同一个对象上调用。最后注意事项代码、运行时数据等的存储方式取决于所使用的JVM,即HotSpot可能与JRockit不同,甚至在相同JVM的不同版本之间也可能有所不同。上面的内容是基于HotsforJava 5和6的(它们基本上是相同的),因为在回答时,我想说大多数人都使用这些JVM。由于Java 8时内存模型发生了重大变化,上述语句可能不适用于Java 8 HotSpot-而且我没有检查Java 7 HotSpot的更改,所以我猜以上对于那个版本仍然是正确的,但我在这里不确定。

    展开全文
  • Java static变量保存在

    万次阅读 多人点赞 2018-07-28 13:28:39
    Main 类没有实例变量,所以他的大小是 16 字节,Mark Word + Klass 指针(64 位 JVM 关闭压缩指针的情况下)。 使用 inspect 命令没有显示出来 InstanceKlass 也就是类型指针的地址,据说是 HSDB 的bug。我们...

    测试环境:

    Microsoft Windows [版本 10.0.17134.165]
    java -version
    java version "1.8.0_171"
    Java(TM) SE Runtime Environment (build 1.8.0_171-b11)
    Java HotSpot(TM) 64-Bit Server VM (build 25.171-b11, mixed mode)

    测试代码:

    import java.io.IOException;
    
    public class Main {
        private static String name = "lgh";
        private static int age = 26;
    
        public int fun() {
            try {
                System.out.println(name);
                System.out.println(age);
                return System.in.read();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return 0;
        }
    
        public static void main(String[] args) {
            new Main().fun();
        }
    }

    编译&运行:

    D:\N3verL4nd\Desktop>javac Main.java
    
    D:\N3verL4nd\Desktop>java -XX:+UseSerialGC -XX:-UseCompressedOops -Xms10m -Xmx10m Main
    lgh
    26

    System.in.read() 的作用等同于断点。

    使用 CLHSDB 连接:

    // 查看进程 id
    D:\>jps
    5792 Jps
    7932 Main
    
    D:\>java -cp .;%JAVA_HOME%/lib/sa-jdi.jar sun.jvm.hotspot.CLHSDB
    hsdb> attach 7932
    Attaching to process 7932, please wait...

    运行 universe

    Heap Parameters:
    Gen 0:   eden [0x0000000012600000,0x00000000127114d0,0x00000000128b0000) space capacity = 2818048, 39.7239507630814 used
      from [0x00000000128b0000,0x00000000128b0000,0x0000000012900000) space capacity = 327680, 0.0 used
      to   [0x0000000012900000,0x0000000012900000,0x0000000012950000) space capacity = 327680, 0.0 usedInvocations: 0
    
    Gen 1:   old  [0x0000000012950000,0x0000000012950000,0x0000000013000000) space capacity = 7012352, 0.0 usedInvocations: 0

    [eden] 0x00000000128b0000 - 0x0000000012600000 = 2B 0000(1260 0000)
    [from] 0x0000000012900000 - 0x00000000128b0000 = 5 0000(120 0000)
    [to] 0x0000000012950000 - 0x0000000012900000 = 5 0000(120 0000)

    可以看到 eden:from:to 大致比例为8:1:1,可以看到新生代的[eden-from-to]内存是连续的。同时可以看新生代和老年代内存是连着的。大概和垃圾回收方式有关。

    扫描我们的 Main 实例:

    hsdb> scanoops 0x0000000012600000 0x00000000128b0000 Main
    0x000000001270afd8 Main
    hsdb> whatis 0x000000001270afd8
    Address 0x000000001270afd8: In thread-local allocation buffer for thread "main" (1)  [0x0000000012703870,0x000000001270b6e8,0x00000000127114b8,{0x00000000127114d0})
    
    hsdb> inspect 0x000000001270afd8
    instance of Oop for Main @ 0x000000001270afd8 @ 0x000000001270afd8 (size = 16)
    _mark: 1
    _metadata._klass: InstanceKlass for Main
    hsdb>

    可见,Main 实例分配在了线程私有的 TLAB 中。
    Main 类没有实例变量,所以他的大小是 16 字节,Mark Word + Klass 指针(64 位 JVM 关闭压缩指针的情况下)。

    使用 inspect 命令没有显示出来 InstanceKlass 也就是类型指针的地址,据说是 HSDB 的bug。我们使用 mem 来获取更详细的信息。

    hsdb> mem 0x000000001270afd8 2
    0x000000001270afd8: 0x0000000000000001 // Mark Word
    0x000000001270afe0: 0x0000000013400598 // 类型指针(与Mark Word 一起组成对象头)

    由于 1 个十六进制位代表 4 个二进制位,所以以上 Mark Word 的最后一位 1 代表的二进制序列为0001。
    这里写图片描述
    也就是 Main 实例处在无锁状态。

    查看该类型指针对应的数据:

    hsdb> inspect 0x0000000013400598
    Type is InstanceKlass (size of 440)
    juint Klass::_super_check_offset: 48
    Klass* Klass::_secondary_super_cache: Klass @ null
    Array<Klass*>* Klass::_secondary_supers: Array<Klass*> @ 0x0000000013000f88
    Klass* Klass::_primary_supers[0]: Klass @ 0x0000000013001c00
    oop Klass::_java_mirror: Oop for java/lang/Class @ 0x0000000012709dc8 Oop for java/lang/Class @ 0x0000000012709dc8

    或者使用 HSDB :
    这里写图片描述

    D:\Java\Tools\jol>java -XX:-UseCompressedOops -jar jol-cli.jar internals java.lang.Class
    # Running 64-bit HotSpot VM.
    # Objects are 8 bytes aligned.
    # Field sizes by type: 8, 1, 1, 2, 2, 4, 4, 8, 8 [bytes]
    # Array element sizes: 8, 1, 1, 2, 2, 4, 4, 8, 8 [bytes]
    
    Failed to find matching constructor, falling back to class-only introspection.
    
    java.lang.Class object internals:
     OFFSET  SIZE                                              TYPE DESCRIPTION                               VALUE
          0    16                                                   (object header)                           N/A
         16     8                     java.lang.reflect.Constructor Class.cachedConstructor                   N/A
         24     8                                   java.lang.Class Class.newInstanceCallerCache              N/A
         32     8                                  java.lang.String Class.name                                N/A
         40     8                                                   (alignment/padding gap)
         48     8                       java.lang.ref.SoftReference Class.reflectionData                      N/A
         56     8   sun.reflect.generics.repository.ClassRepository Class.genericInfo                         N/A
         64     8                                java.lang.Object[] Class.enumConstants                       N/A
         72     8                                     java.util.Map Class.enumConstantDirectory               N/A
         80     8                    java.lang.Class.AnnotationData Class.annotationData                      N/A
         88     8             sun.reflect.annotation.AnnotationType Class.annotationType                      N/A
         96     8                java.lang.ClassValue.ClassValueMap Class.classValueMap                       N/A
        104    40                                                   (alignment/padding gap)
        144     4                                               int Class.classRedefinedCount                 N/A
        148     4                                                   (loss due to the next object alignment)
    Instance size: 152 bytes
    Space losses: 48 bytes internal + 4 bytes external = 52 bytes total

    使用 jol 获得 Class 对象的大小为 152,也就是 19 个字长。

    hsdb> inspect 0x0000000012709dc8
    instance of Oop for java/lang/Class @ 0x0000000012709dc8 @ 0x0000000012709dc8 (size = 176)
    name: "lgh" @ 0x000000001270af80 Oop for java/lang/String @ 0x000000001270af80
    age: 26
    hsdb> mem 0x0000000012709dc8 22
    0x0000000012709dc8: 0x0000002a139a5501 // 1
    0x0000000012709dd0: 0x0000000013013ed0 // 2
    0x0000000012709dd8: 0x0000000000000000 // 3
    0x0000000012709de0: 0x0000000000000000 // 4
    0x0000000012709de8: 0x0000000000000000 // 5
    0x0000000012709df0: 0x00000000126e5348 // 6
    0x0000000012709df8: 0x000000001270a4c8 // 7
    0x0000000012709e00: 0x0000000000000000 // 8
    0x0000000012709e08: 0x0000000000000000 // 9
    0x0000000012709e10: 0x0000000000000000 // 10
    0x0000000012709e18: 0x0000000000000000 // 11
    0x0000000012709e20: 0x0000000000000000 // 12
    0x0000000012709e28: 0x0000000000000000 // 13
    0x0000000012709e30: 0x00000000127097d0 // 14
    0x0000000012709e38: 0x0000000000000000 // 15
    0x0000000012709e40: 0x0000000000000000 // 16
    0x0000000012709e48: 0x0000000013400598 // 17 类型指针
    0x0000000012709e50: 0x0000000000000000 // 18
    0x0000000012709e58: 0x0000001600000000 // 19
    0x0000000012709e60: 0x0000000000000001 // 20
    0x0000000012709e68: 0x000000001270af80 // 21 "lgh" 的引用
    0x0000000012709e70: 0x000000000000001a // 22 "26" 的 16 进制表示

    可以看到 static 变量保存在 Class 实例的尾部。
    Class 对象确实在堆中。
    类型指针保存在 Class 实例 17 * 8 的位置上。

    展开全文
  • 所以,静态数据成员的定义(初始化)不应该被放在头文件中。 其定义方式与全局变量相同。举例如下: xxx.h文件 class base{ private: static const int _i;//声明,标准c++支持有序类型在类体中初始化,但vc6不支持...
  • 小编典典静态方法(实际上是所有方法)以及静态变量都存储在PermGen堆的部分中,因为它们是反射数据(与类相关的数据,而不与实例相关的数据)的一部分。更新说明:请注意,只有变量及其技术值(原始或引用)存储在PermGen...

    小编典典

    静态方法(实际上是所有方法)以及静态变量都存储在PermGen堆的部分中,因为它们是反射数据(与类相关的数据,而不与实例相关的数据)的一部分。

    更新说明:

    请注意,只有变量及其技术值(原始或引用)存储在PermGen空间中。

    如果你的静态变量是对对象的引用,则对象本身存储在堆的常规部分(青年/旧世代或幸存者空间)中。这些对象(除非它们是类之类的内部对象)不会存储在PermGen空间中。

    例:

    static int i = 1; //the value 1 is stored in the PermGen section

    static Object o = new SomeObject(); //the reference(pointer/memory address) is stored in the PermGen section, the object itself is not.

    关于垃圾回收的一句话:

    不要不依赖finalize(),因为它不能保证运行。JVM完全可以决定何时运行垃圾收集器以及收集什么,即使对象符合垃圾收集的条件。

    当然,你可以将静态变量设置为null,从而删除对堆上对象的引用,但这并不意味着垃圾收集器将收集它(即使没有更多引用了)。

    另外,finalize()它仅运行一次,因此你必须确保它不会引发异常,否则会阻止对象被收集。如果你通过某些异常暂停完成,finalize()则不会再次在同一对象上调用。

    最后要注意的是:如何存储代码,运行时数据等取决于所使用的JVM,即HotSpot可能与JRockit不同,并且在同一JVM版本之间甚至可能有所不同。上面的内容基于Java 5和6的HotSpot(基本上是相同的),因为在回答之时,我会说大多数人都使用了这些JVM。由于Java 8的内存模型发生了重大变化,因此上述陈述可能不适用于Java 8 HotSpot,并且我没有检查Java 7 HotSpot的变化,所以我想以上对于该版本仍然适用,但我不确定在这里。

    2020-03-06

    展开全文
  • 静态变量存储在哪个区

    万次阅读 2019-06-26 22:40:35
    静态变量存储在__区 A 全局区 B 堆 C 栈 D 常量区 参考答案:A 知识点 内存到底分几个区? 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。 2、堆区(heap) — 一般由程序员...
    静态变量存储在__区 
    A 全局区 
    B 堆 
    C 栈 
    D 常量区
    

    参考答案:A


    知识点

    内存到底分几个区?

    1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。

    2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由os回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。

    3、全局区(静态区)(static)—全局变量静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后有系统释放。

    4、文字常量区 — 常量字符串就是放在这里的。 程序结束后由系统释放。

    5、程序代码区 — 存放函数体的二进制代码

    展开全文
  • 文章目录静态变量、实例变量、局部变量在JVM中存放的位置 静态变量、实例变量、局部变量在JVM中存放的位置 总结一下这三种变量在JVM中存放的位置,首先看一段代码: public class StaticObjTest { static class ...
  • 静态变量放在方法区还是堆里,我看《深入理解Java虚拟机》书里写的是放在方法区里? 回答:从《Java虚拟机规范》所定义的概念模型来看,所有Class相关的信息都应该存放在方法区之中,但方法区该如何实现,《Java...
  • java 静态(static)变量放在那里?

    万次阅读 2016-07-07 08:55:43
    java的静态变量我一直纠结放在堆中,还是永久代中,今天来做个试验: import java.util.HashMap; public class Test { static HashMap ha = new HashMap(); public static void main(String args[]) { for(int i...
  • 实际上在arm-linux-gcc这个开发环境中,如果全局变量的初始值是0,编译器会将该全局变量放在BSS段。 初始值是0的全局变量放在BSS段会有什么问题? 如果少了text代码帮他初始化为0,这个全局变量将会成为随机值。而...
  • 1、bss是英文block started by symbol的简称,通常是指用来存放程序中未初始化的全局变量的一块内存区域,在程序载入时由内核清0。bss段属于静态内存分配。它的初始值也是由用户自己定义的连接定位文件所确定,用户...
  • C++类中静态变量和静态方法使用介绍

    万次阅读 多人点赞 2018-08-14 10:45:26
     最近一直看c++相关的项目,但总是会被c++类中的静态成员变量静态成员函数的理解感觉很是模糊,不明白为什么类中要是用静态成员变量.于是在网上搜集了一些资料,自己再稍微总结下。 静态成员的概...
  • static静态变量的理解

    千次阅读 2018-07-22 17:26:37
    static静态变量的理解 静态变量 类型说明符是static。静态变量属于静态存储方式,其存储空间为内存中的静态数据区(在静态存储区内分配存储单元),该区域中的数据在整个程序的运行期间一直占用这些存
  • c/c++静态变量和静态函数

    千次阅读 2018-11-11 15:32:26
    而内存主要分为两类:静态存储区和动态存储区; 静态存储区分为:只读数据(READONLY DATA)区、以读写数据(RW DATA)区、未初始化区(BSS)。它们都是在程序编译连接阶段确定的,在程序执行的阶段不会改变。 ...
  • 关于全局变量和局部变量,静态变量的关系如何?以及他们在内存在是存储于部分的?做个记录,以便往后查看。 1. 全局变量和静态变量 全局变量:又称外部变量,与之相对的是局部变量,是从变量的作用域上来考量的...
  • 1、静态变量会被放在程序的静态数据存储区里,这样可以在下一次调用的时候还可以保持原来的赋值。这一点是他与堆栈变量和堆变量的区别,单例模式就是利用这个机制。 2、变量用static告知编译器,自己仅仅在变量的...
  • Python使用函数默认值实现函数静态变量,如果是静态方法,可以使用@staticmethod标注。一、Python函数默认值Python函数默认值的使用可以在函数调用时写代码提供方便,很多时候我们只要使用默认值就可以了。 所以函数...
  • 1、局部变量能否和全局变量重名?  答:能,局部会屏蔽全局。要用全局变量,需要使用 ":: "  局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。对于有些编译器...
  • 在工具类中,通常会初始化一些单例变量,这些变量由于只会初始一次,并不适合放在构造函数中,因此通常选择在静态代码块中执行,那么在一个类中,就会涉及到静态变量和静态代码块的初始化执行顺序问题。 public ...
  • C语言中的静态变量和非静态变量

    万次阅读 多人点赞 2017-11-30 15:05:52
    1.全局静态变量:在全局变量前面加上关键词static,全局变量就被定义成一个全局静态变量。 (1)内存中的位置:静态存储区。 (2)作用域:在程序任何地方都是可见的。 2.局部静态变量:在局部变量前面加上关键词...
  • spring boot静态变量赋全局变量

    千次阅读 2019-07-01 21:24:56
    spring boot 无法直接给静态变量赋值,需要调用set方法才能赋值。
  • 静态变量所引用的实例位于Java堆或运行时常量池。Java字节码与Native机器码不同,字节码是运行在JVM这一平台上的,字节码在被解释的过程中,具体的执行方式因JVM的不同实现而不同,但是对于JVM来说,它的各种不同...
  • java中什么叫静态成员变量

    千次阅读 2021-02-26 08:24:08
    静态变量当然是属于静态存储方式,但是属于静态存储方式的量不一定就是静态变量,例如外部变量虽属于静态存储方式,但不一定是静态变量,必须由 static加以定义后才能成为静态外部变量,或称静态全局变量。...
  • 1.又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。 2.方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量。 3.运行时常量池 常量池 1.常量池中包含代码中所...
  • 静态代码块与静态变量的执行顺序

    千次阅读 2018-08-08 20:20:39
    在工具类中,通常会初始化一些单例变量,这些变量由于只会初始一次,并不适合放在构造函数中,因此通常选择在静态代码块中执行,那么在一个类中,就会涉及到静态变量和静态代码块的初始化执行顺序问题。     ...
  • 2)没有初始值的全局变量放在BSS段。 实际上在arm-linux-gcc这个开发环境中,如果全局变量的初始值是0,编译器会将该全局变量放在BSS段。 初始值是0的全局变量放在BSS段会有什么问题? 这个全局变量将会成为随机值...
  • C语言静态变量和静态函数(转)

    千次阅读 2019-06-13 10:05:22
    对于D:静态变量放在程序的全局数据区,而不是在堆栈中分配,所以不可能导致堆栈溢出,D是错误的。 因此,答案是A、B、C。 问题:不可重入函数 曾经设计过如下一个函数,在代码检视的时候被提醒有bug,因为这个函数...
  • C++全局变量和静态变量的使用

    千次阅读 2017-03-16 13:43:08
     也可以把全局变量的声明和定义放在一起,这样可以防止忘记了定义,如上面的extern char g_szBuffer[g_nBufferSize]; 然后把引用它的文件中的#include "res.h"换成extern char g_szBuffer[];。  但是这样做很...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 315,235
精华内容 126,094
关键字:

静态变量放在哪