Java 堆、栈和方法区

Java中的堆和栈都是java在内存中存储数据的地方

java中用于存储对象的地方,jvm中只有一个堆区,被所有线程共享,不能存放基本数据类型和对象引用,只存放对象本身。

GC管理的主要区域,在虚拟机启动时创建,用于存放对象实例和数组

优点:动态分配内存大小。生存期也不必事先告诉编译器,可以被垃圾回收器自动回收

缺点:由于需要动态分配内存,因此存取速度较慢

栈:虚拟机栈(VM stack) 和 本地方法栈(Native method stack)

虚拟机栈

线程私有的,用于描述方法执行时的内存模型,方法调用时创建一个栈帧(存储局部变量表、操作数栈、方法出口)
每个方法的调用直到执行完成,对应的都是栈帧在虚拟机中入栈和出栈的过程

局部变量表

每一个线程都有一个栈区,只用于保存基本数据类型和对象的引用(注意:不是对象,对象都保存在堆区)

每个栈区中的数据都是私有的,栈中的数据可以共享,但其他栈区不能访问,
但应该注意这种数据共享与像个对象的引用同时指向一个对象是不同的,该变其中一个值并不会对另一个变量产生影响

==栈区分为三个部分:基本类型变量区、执行环境上下文、操作指令区 ???==

优点:存取速度比堆块,仅次于直接位于cpu的寄存器

缺点:存放在栈区的数据大小和生存周期必须确定

方法区

又称为静态区,被所有线程共享,方法区中包含所有的class 和static 变量

方法区中包含的都是java程序中永远唯一的元素

方法区存放虚拟机加载类的相关信息,如类、静态变量、常量

运行时常量池

方法区的一部分,用于存放编译期生成的各种字面量和符号引用
(字符串、符号引用如:类和接口的全限定名字段的名称和描述符方法的名称和描述符)

你可能感兴趣的:(java学习笔记)