基本概念:
每运行一个java程序会产生一个java进程,每个java进程可能包含一个或者多个线程,每一个Java进程对应唯一一个JVM实例,每一个JVM实例唯一对应一个堆,每一个线程有一个自己私有的栈。进程所创建的所有类的实例(也就是对象)或数组(指的是数组的本身,不是引用)都放在堆中,并由该进程所有的线程共享。Java中分配堆内存是自动初始化的,即为一个对象分配内存的时候,会初始化这个对象中变量。虽然Java中所有对象的存储空间都是在堆中分配的,但是这个对象的引用却是在栈中分配,也就是说在建立一个对象时在堆和栈中都分配内存,在堆中分配的内存实际存放这个被创建的对象的本身,而在栈中分配的内存只是存放指向这个堆对象的引用而已。局部变量 new 出来时,在栈空间和堆空间中分配空间,当局部变量生命周期结束后,栈空间立刻被回收,堆空间区域等待GC回收。
JVM的内存可分为3个区:堆(heap)、栈(stack)和方法区(method,也叫静态区).
堆区:
1:存储的全部是对象,每个对象都包含一个与之对应的class的信息(class的目的是得到操作命令)
2:jvm只有一个堆区(heap),且被所有线程共享,堆中不存放基本类型和对象的引用,只存放对象的本身和数组本身.
栈区:
1:每个线程包含一个栈区,栈中只保存基本数据类型本身和自定义对象的引用.
2:每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问.
3:栈分为3个部分:基本类型变量区,执行环境上下文,操作指令区(存放操作指令).
方法区(静态区):
1:被所有的线程共享,方法区包含所有的class(class是指类的原始代码,要创建一个类的对象,首先要把该类的代码加载到方法区,并且初始化)和static变量.
2:方法区包含的都是在整个程序中永远唯一的元素,如class,static变量.