Java应用程序运行在内存中,更准确的说运行在jvm上,jvm启动会运行在内存中。

所以编译的时候,只是检查语法问题,并不会在内存中开辟空间。

运行时Jvm会对内存做进一步的划分:

1、寄存器

2、本地方法区

3、方法区

   Java程序运行的时候,首先会通过类装载器载入类文件的字节码信息,经过解析后将其装入方法区,类的各种信息(包括类信息、常量、静态变量等)都在方法区中保存,该内存区域被所有线程共享,存在一块特殊的内存区域,叫常量池(Constant Pool),这块内存将与String类型的分析密切相关。

4、栈内存

a)存储局部变量,而且变量所属的作用域一旦结束,该变量(内存)就自动释放

b)局部代码块:限定局部变量的生命周期

5、堆内存

a)存储数组和对象(其实数组就是对象),凡是通过new创建出来的都建立在堆中

b)原理图及特点Int[] arr = newint[3];
111140248.jpg

i.主函数先进入栈区,然后其中有一个arr变量,也进入栈

ii.通过new在堆中开辟一块空间,内存在存储数据的时候都是通过地址体现的(二进制),二进制很长,所以用16进制表示

iii.每一个实体都有一个首地址值

iv.堆内存中的每一个变量都有默认的初始化值,根据类型的不同而不同(各种各样的0

v.栈中的变量引用堆内存中的首地址

vi.如果将arr的值置为null,那么堆中的空间就没有引用,垃圾回收器就会回收。栈自动释放

c)创建过程实例:
int[] x = new int[3];
int[] y = new int[3];//在栈区和堆区中分配空间,栈的内容指向堆空间的地址。并初始化堆中的变量。
111229190.jpg

x[0] = 5;
y[0] = 8;//为堆中的变量赋值
111336736.jpg

x=y;将栈中y的值赋给x(让x也指向y
111418300.jpg

此时输出x[0]8.


6、Java实例变量存放在内存中的堆(heap)上;
局部变量存放在内存中的栈(stack)上;
方法是在调用时才压进栈的。
关于变量的创建时间:
静态变量是在类被JVM加载(比如在命令行中输入java ClassName)时创建的并保持在堆上,也是在JVM退出运行时被清理(所占内存被释放)。

实例变量是在类被实例化时(典型的情况为ClassNameinstance = new ClassName())创建的,保持在堆上,在类的实例被GC(垃圾回收)清理时释放内存空间,生命周期结束。

局部变量(大多情况为方法的参数和在方法内创建的变量)在方法被调用时(在栈上)创建,在方法调用结束时销毁。

方法(包括main方法)也是在调用时才按照方法内代码的顺序进栈,调用结束时按与原顺序相反顺序出栈。所以,一般情况下,方法内声明的变量对外不可见,即不可被外部引用。在方法外部意味着方法还没有被调用(此时方法内变量还没有创建)或者方法已经调用完毕(此时方法内的变量已经被销毁)

+===================================+