public void function(){
Object obj = new Object();
}
function方法被执行的时候,JVM在JVM栈中为function创建一个栈帧,用于存放function在运行过程中的一些信息。 Object obj被执行时,JVM在function方法对应的栈帧中的本地变量表中创建Object类型的引用obj。 new Object()被执行时,JVM在堆内存中创建一块Object类型的、包含实例数据值的结构化内存。 PS:不同的类型所对应的这块结构化内存的长度是不一样的。
综上所述:句柄池就相当于一个中转站,我们要查询的实例对象数据需要通过一次间接索引获取;而指针的直接访问无需中转站,引用指向的就是要访问的实例对象数据。
此外,不管是哪种对象的访问方式,引用所指向的堆内存中的数据都是有两部分组成,其中有一部分一定是一个指向方法区中的对象类型的指针。
public class A(){
public static void main(String[] args){
while(true){
new Person();
}
}
}
//运行结果中出现:java.lang.OutOFMemory:Java heap space
//说明是在堆内存中发生了OOM异常。
; c)如何解决? 使用内存映像分析工具:Eclipse Memory Analyzer对dump出来的堆转储快照进行分析,重点是确认内存中的对象是否是必要的,即要搞明白是内存泄漏还是内存溢出。 PS:内存泄漏导致的OOM:new出来的很多对象已经不需要了,但仍然有引用指向,所以垃圾回收机制无法回收。 PS:内存溢出:new出来的对象都是需要的,但堆内存太小装不下了。 如果是内存泄漏,通过工具查看泄漏对象到GC Roots的引用链。找到泄漏对象是通过怎样的路径与GC Roots发生关联,然后导致垃圾回收机制无法自动回收的。 如果不存在内存泄漏,也就是所有的对象都必须存在,这时候就调大堆内存。