关于Java技术的一些思考(1)

当编写一句int a = 1;时,计算机内部到底发生了什么?

首先我们编写的Java源文件,如Test.java是存储在硬盘中的,负责持久化的保存文件,当然,我们需要在一个类中编写代码,还需要一个main方法

class Test{
    public static void main(String[] args){
        int a = 1;
        System.out.print(a);
    } 
}

但Java源文件计算机不可识别,需要通过javac命令将.java文件编译成计算机可识别的字节码文件Test.class。Java程序的执行,需要在计算机的另一片空间,内存中,JVM在整个计算机的内存中开辟了一片空间来执行Java程序。

在一般的Java开发中,基本只涉及JVM中的三块区域:栈内存、堆内存、方法区(元空间)

栈内存存储了:

  • 变量空间

  • 计算时的临时副本空间

  • 方法执行的临时空间

机制:用完即回收,FILO(first in last out),空间相对较小

堆内存:

  • new关键字申请的内存空间(数组/对象) ,反射中的newInstance也可以

机制:GC(garbage collection)垃圾回收

方法区:

  • 存储只有一份的内容,如类模板(Class对象)

  • 静态元素、常量、字符串对象

了解了Java虚拟机的内存空间后,我们再回来思考开始的那个问题。

在经过javac指令编译后,大多数人通常会有一个疑问,为什么执行程序时,输入java Test而不是java Test.class

其实java指令,执行的是已经加载到内存中的Test类,所以不需要加.class。

显而易见,执行了一条java指令,背后应该有两道程序,先被动的将class文件加载到JVM的方法区中,再执行程序,也就是Java虚拟机会寻找类模板中的main方法入口,将其压栈到栈内存中。

int a = 1;这条语句=的左侧,a是一个小盒子,也就是开辟的一个变量空间,名称叫做a,同时Java是强类型语言,int规定了变量空间存储内容的类型只能为int整数,=右边的1是常量,以32bit的二进制存储在常量池中,这样的过程称为等号赋值

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值