在Java运行时区域中,程序计数器、虚拟机栈、本地方法栈3个区域随线程的而生,随线程而灭,因此这几个区域的内存分配和回收都具有确定性,在这几个区域内就不需要多考虑回收的问题,因此方法结束或者线程结束时,内存自然就跟随着回收了。
而Java堆和方法区则不一样,一个接口中的多个实现类需要的内存可能不一样,一个方法中的多个分支需要的内存也可能不一样,我们只有在程序处于运行期间才能知道会创建哪些对象,这部分内存的分配都是动态的,垃圾收集器所关注的是这部分内存。
以常用的虚拟机HotSpot和常用的内存区域Java堆为例,深入探讨HotSpot虚拟机在Java堆中对象分配、布局和访问全过程。
当你在Java中声明一个新的字符串时,在这个场景下有一些有趣的事情发生。
这是一个基本的字符串声明,我们创建了一个新的字符串变量employee
并给它赋值。
1 | String employee = "Edgar Allen Poe"; |