java虚拟机内存原型
寄存器:我们在程序中无法控制
栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中
堆:存放用new产生的数据
静态域:存放在对象中用static定义的静态成员
常量池:存放常量(如字符串常量)
非RAM(内存)存储:硬盘等永久存储空间
java内存分配中的栈
java虚拟机会为该线程分配一个java栈。该线程在执行某个java方法的时候,用于存储参数、局部变量、操作数、中间运算结果等。当这个方法执行完的时候,便会释放资源
在函数中定义的一些基本类型的变量数据和对象的引用变量都在函数的栈内存中分配。
当在一段代码块定义一个变量时,Java就在栈中 为这个变量分配内存空间,当该变量退出该作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。
java内存分配中的堆
java虚拟机中的堆用来存放由new创建的对象和数组。 在堆中分配的内存,由Java虚拟机的自动的垃圾回收机制来管理堆的内存。
简单的说和栈相对,堆主要是用来存放java对象的,栈主要是用来存放对象引用(数组或对象)。
数组和对象在没有引用变量指向它的时候,才变为垃圾,不能在被使用,但仍然占据内存空间不放,在随后的一个不确定的时间被垃圾回收器收走(释放掉)
常量池
常量池指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。
各种基本类型(如int、long等等)和对象型(如String及数组)的常量值(final)
在程序执行的时候,常量池 会储存在Method Area,而不是堆中。