对象与内存

Posted 永不宕机

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了对象与内存相关的知识,希望对你有一定的参考价值。

java内存管理分为两方面:内存的分配与内存的回收。

jvm的垃圾回收机制是由一条后台线程完成的,如果肆无忌惮创建对象,让系统分配内存,则会造成系统可用内存的减少,降低了程序运行的性能,同时也会加重垃圾回收机制的负担,程序运行性能会更低。

java程序的变量大体可分为成员变量和局部变量。局部变量又分为如下三类:1.形参:在方法签名中定义的局部变量,由方法调用者负责为其赋值,随方法的结束而消亡。2.方法体内的局部变量:在方法内定义的局部变量,必须在方法体内对其进行显示初始化。从初始化完成之后开始生效,随方法的结束而消亡。3.代码块内的局部变量:在代码块中定义的局部变量,必须在代码块中对其进行初始化,从初始化完成生效,随代码块结束而消亡。

局部变量被存储在方法的栈内存中。

定义成员变量时,如果用static修饰的变量则称为类变量或静态成员变量,而没有被static修饰的成员变量则称为非静态成员变量或实例变量,static只能修饰类里的成员,不能修饰外部类,局部变量以及局部内部类。

注意:在加载类时,首先会加载静态成员变量,静态成员方法(按代码顺序进行加载),然后才加载非静态变量和方法。如下代码所示:

public class Test{
    
    int a = b +  2;
    static int b = 10;

}
//上面Test的代码正确
public class Test1{
    
    static int a = b +  2;
    static int b = 10;

}
public class Test2{
    
    int a = b +  2;
    int b = 10;

}
//上面Test1和Test2的代码是错误的正确(非法前向引用)
类变量属于类本身,而实例变量则属于该类的实例。在同一个jvm中,每个类只有一个class对象,但可以有多个实例对象。因此,在同一个jvm中,一个类的类变量只需要一块内存空间,而每创建一次实例则需要为该实例变量分配一块内存空间。类变量和实例变量在内存中的存储结构如下:
1 public class Person{
2 
3     public static double money;
4 
5     public String name;
6 
7     public String sex;
8 
9 }

 

请注意一下代码的执行顺序,根据注意事项可知,在运行java类时,首先会为各个成员变量进行分配空间,然后才按照顺序对其进行初始化。

 

上图运行流程如下:首先为成员变量分配内存空间,然后运行静态代码(按照顺序),先为name初始化为“java编程”,然后再将其初始化为“我爱java”。接着在调用构造函数时,先运行非静态代码块,为wight初始化为10.0,然后再将wigt的值修改为20.0,最后才执行构造函数内的代码。

 

注意以下两段代码的运行结果:

以上是关于对象与内存的主要内容,如果未能解决你的问题,请参考以下文章

片段 - 全局视图变量与本地和内部类侦听器和内存泄漏

C 中的共享内存代码片段

java 代码片段

VSCode自定义代码片段12——JavaScript的Promise对象

VSCode自定义代码片段12——JavaScript的Promise对象

VSCode自定义代码片段——JS中的面向对象编程