谈谈对JVM内存分配
JVM的分区可分为三个:堆(heap)、栈(stack)和方法区(method):堆主要用来存放对象的,栈主要是用来执行程序的
堆区
- 存储的是对象,并且JVM只有一个堆区,被所有线程共享。
- 比如new string等等对象
- 由于要在运行时动态分配内存,存取速度较慢
- 先进先出
栈区
- 每个线程包含自己的一个栈区,栈中只保存基本数据类型的对象和自定义对象的引用记住是引用地址,指向堆中的对象
- 栈与栈之间不能直接访问
- 存取速度快,但是生命周期是固定的区域。
- 先进后出
栈有一个很重要的特殊性,就是存在栈中的数据可以共享。假设我们同时定义: int a = 3; int b = 3; 编译器先处理int a = 3;首先它会在栈中创建一个变量为a的引用,然后查找栈中是否有3这个值,如果没找到,就将3存放进来,然后将a指向3。接着处理int b = 3;在创建完b的引用变量后,因为在栈中已经有3这个值,便将b直接指向3。这样,就出现了a与b同时均指向3的情况。