JavaSE 内存管理

Java运行时数据区域

java分了5片内存。

1:寄存器。2:本地方法区。3:方法区。4:栈。5:堆。

:存储的都是局部变量 ( 函数中定义的变量,函数上的参数,语句中的变量 );

只要数据运算完成所在的区域结束,该数据就会被释放。

:用于存储数组和对象,也就是实体。啥是实体啊?就是用于封装多个数据的。

1:每一个实体都有内存首地址值。

2:堆内存中的变量都有默认初始化值。因为数据类型不同,值也不一样。

3:垃圾回收机制。

  • 垃圾回收机制回收的是堆里面的内存,栈里面的数据自动入栈自动出栈
  • 引用类型的数据在堆当中,内存中操作的只有栈,new关键字在堆里面分配一块内存
  • String是不可变字符,即一旦分配了内存,此内存的值将不会改变,又将String赋值是会重新分配一块内存,字符串池: StringBuffer
  • 在堆中的东西叫对象

对象访问过程

在Java语言中,对象访问是如何进行的?

答:对象访问在Java语言中无处不在,是最普通的程序行为,但即使是最简单的访问,也会却涉及Java栈、Java堆、方法区这三个最重要内存区域之间的关联关系,如下面的这句代码:

Object obj = new Object();

假设这句代码出现在方法体中,那“Object obj”这部分的语义将会反映到Java栈的本地变量表中,作为一个reference类型数据出现。而“new Object()”这部分的语义将会反映到Java堆中,形成一块存储了Object类型所有实例数据值(Instance Data,对象中各个实例字段的数据)的结构化内存,根据具体类型以及虚拟机实现的对象内存布局(Object Memory Layout)的不同,这块内存的长度是不固定的。另外,在Java堆中还必须包含能查找到此对象类型数据(如对象类型、父类、实现的接口、方法等)的地址信息,这些类型数据则存储在方法区中。

例子:Person tom = new Person(1, 25)