一:Java虚拟机内存原型:
寄存器:……
堆:存放对象
栈:存放引用,基本类型的数据,基本单位是栈帧
静态域:存放由static修饰的变量
常量池:存放常量。
二:常量池
常量池是指在编译时期被确定,并且保存在class文件中的数据。除了基本类型和string的常量值(final)的数据外,还包括一些以文本形式出现的符号引用:
1.类的接口和全限定名
2.字段的名称和描述符
3.方法的名称和描述符
虚拟机必须为每个已经转载的类型维护一个常量池,在Java虚拟中常量池是一表的形式存在的,对于string类型,有一张固定长度CONSTANT_String_info表用来存储字符串
三:Java内存分配的栈
每个Java线程运行的时候,Java虚拟机都要为这个线程分配一个栈。栈的基本单位是栈帧,每当线程执行到一个方法,就向栈中压入一个栈帧,这个栈帧中存放执行方法的局部变量、参数、操作数、中间执行结果。当方法执行完,栈帧弹出。Java栈中的数据在各个线程之间是私有的,即其他线程不能访问本线程的栈。上面说到引用本身是存储在栈中的。
栈的特性之一:数据共享
如果栈中已经存在了一个值,那个当另一个变量也等于这个值时,这个对象就会只想这个既有的值。但是当他变化时,这个值不会改变,对象会重新指向另一个值,或者新加入一个值。
四:Java内存分配的堆
堆用来存储new出来的对象,和数组。当一个对象没有一个引用指向它时,这个对象就变为了垃圾,在随后的某个时刻会被Java虚拟机的垃圾回收器收回。栈中的引用其实是执行堆中开辟内存地址的首地址。这也是为什么称为“引用”。动态分配内存,不用直到生存期。