首页 > 系统相关 >0 工作方式和内存管理

0 工作方式和内存管理

时间:2022-11-29 21:33:10浏览次数:42  
标签:Java 变量 方式 管理 对象 虚拟机 局部变量 实例 内存

0 工作方式及内存管理

0.0 工作方式

什么是Java程序?如何进行提交?

  • Java程序是由一组类所组成的,其中有一个类会带有启动用的main()方法。因此程序员必须要编写一或多个类并以此提交。若用户没有Java虚拟机则必须一并提交才能让应用程序运行起来。

具体步骤:

  • 编写源代码文件;
  • javac编译程序文件,即.java文件变成.class文件(由字节码组成);
  • 启动Java虚拟机来运行.class文件,JVM将字节码转换成平台能够理解的形式来运行;
  • Java虚拟机启动执行时,它会寻找你在命令列所指定的类。然后它会锁定像下面这样一个特定的方法main()

JVM和编译器:

  • Java虚拟机让程序运行起来
  • 存取权限的安全问题由Java虚拟机来把关,编译器只做些标点符号的检查。
  • 违反调用private方法的程序等也是由编译器检查,防止人们动到不可以碰的程序代码和其他类的重要数据。
  • Java虚拟机也要租同样的事情,确保不会有人在执行前修改二进制代码。

0.1 Java内存管理

程序员决定了对象何时创建,如何创建,也决定了何时销毁对象。但程序员并不能自消灭对象,只是声明要放弃它。一旦它被放弃了,GC就会将它蒸发掉。回收对象所占用的内存空间。

堆与栈:

  • 在Java中,程序员会在乎内存中的两种区域:

    • 对象的生存空间 堆(heap)
    • 方法调用及变量的生存空间 栈(stack)
  • 当Java虚拟机启动时,它会从底层操作系统取得一块内存,并以此区段来执行Java程序。(有多少内存,以及能否调整要看Java虚拟机和平台的版本而定)

  • 变量的生存空间要根据是哪一种变量而定:

    • 实例变量
      • 声明在类中而不是方法里面,实例变量存在于所属的对象中,每个实例可以不同。
    • 局部变量 —— 栈变量
      • 局部变量和方法的参数都是被声明在方法中。它们是暂时的,且生命周期只限于方法被放在栈上的这段时间。
  • 调用一个方法,方法会放在调用栈的栈顶。

    • 实际被堆上栈的是栈顶块,它带有方法的状态,包括执行到哪一行程序以及所有的局部变量的值。
    • 栈顶上的方法是目前正在执行的方法。
    • 方法一直待在这里知道执行完毕。
  • 栈上的对象引用

    • 对象局部变量,非 primitive 的变量只是保存对象的引用而已,而不是对象本身。如果局部变量是个对 对象的引用,只有变量本身会放在栈上。对象本身只会存在于堆上。
  • 问:到底为什么要知道栈和堆的机制?这真的跟我们有关系吗?

    • 如果想要了解变量的有效范围(scope)、对象的建立、内存管理、线程(thread)和异常处理,则认识堆和栈是很重要的。
  • 实例变量

    • 新建一个对象,Java必须在堆上找一个空间,足以存放该对象所有实例变量的空间。

    • 实例变量存在于对象所属的堆空间上。

      • primitive 主数据类型,则根据Java根据primitive 主数据类型的大小为该实例变量留下空间。
        • 对象引用,不需要保留对象带有的所有对象的空间,因为引用变量的值并不是对象本身,只是对象的存取方法,大小一定。
        • 而对象引用变量是否会指向堆上的对象,或者说实例变量对象是否会取得堆上的空间,这取决于具体的代码,有没有赋值。

总结:

  • 堆与栈都是内存空间
  • 实例变量是声明在类中方法之外的地方。
  • 局部变量是声明在方法或方法的参数上
  • 所有局部变量都存在于栈上相对应的堆栈块中。
  • 对象引用变量primitive主数据类型变量都是放在栈上。
  • 不管实例变量或局部变量,对象本身都会在堆上
  • 实例变量保存在所属的对象中,位于堆上。
  • 如果实例变量是个对对象的引用,则引用与对象都是在堆上。
  • 实例变量有默认值,原始的默认值是 0/0.0/false,引用的默认值是 null 。
  • 不可能提供默认值的时候,就不需要提供无参数的构造函数了。

标签:Java,变量,方式,管理,对象,虚拟机,局部变量,实例,内存
From: https://www.cnblogs.com/whxky/p/16936782.html

相关文章