深入理解java虚拟机(2)

一、对象的访问

-----------------------------------------------------

  1.对象的访问与java栈、堆和方法区之间的关联关系。

    eg:Object obj = new Object();

    (1)这句话中Object obj对象的引用这部分的语义会保存在java栈的本地变量中,作为一个引用数据类型出现、、

    (2)new Object() 创建对象的这部分语义会反映到java堆中,形成了一块存储了Object类型所有实例数据值的结构化内存,

二、outOfMemoryError异常

-------------------------------------------------------------

  1.java堆溢出。堆用于存储对象实例,我们只要不断的创建对象,并且保证GC Roots到对象之间有可达路径来避免垃圾回收机制清除这些对象,就会在对象数量达到最大堆的容量限制后产生堆内存溢出异常。堆内存溢出时,异常堆栈信息"java.lang.OutOfMemoryError"会进一步提示"Java heap space"

  2.解决这个区域异常一般方法是,通过映像分析工具分析内存中对象是否是必要的,分清楚是内存泄漏(Memory Leak)还是内存溢出(Memory Overflow)。如果是内存泄漏,可以通过工具查看到泄漏对象到GC Roots的引用链,于是就能找到泄漏对象是通过怎样的路径与GC Roots相关联并导致垃圾回收器无法自动回收垃圾的。掌握泄漏对象的类型信息,以及GC Roots引用链的信息就可以比较准确地定位出泄漏代码的位置;如果不存在泄漏问题,内存中的对象确实都还必须活着,那就应该检查虚拟机的参数(-Xmx与-Xms),与机器物理内存对比看是否还可以调大,从代码上看是否存在某些对象生命周期过长、持有状态时间过长的状况,尝试减少程序运行的内存消耗。

  3.虚拟机栈和本地方法区溢出。栈容量设定只由-Xss参数决定。虚拟机栈和本地方法栈,在java中有两种异常:

    (1)StackOverFlowError:如果线程请求的栈深度大于虚拟机允许的最大深度就会抛出这个错误。

        使用-Xss参数减少栈内存容量,结果抛出StackOverflowError异常,异常出现的时候虚拟机栈深度相应的缩小

        定义了大量的本地变量,增加了此方法帧中本地变量表的长度

    (2)OutOfMemoryError:如果虚拟机在扩展栈的时候无法申请到足够的内存空间就会抛出这个错误

   4.运行时常量池溢出

   5.常量池溢出

   6.方法区溢出。方法区用于存放Class的相关信息,如类名、访问修饰符、常量池、字段描述、方法描述等。

     (1)对于这个区域测试:运行时产生大量的类来填满方法区,知道溢出。

    

原文地址:https://www.cnblogs.com/bigdata-stone/p/9639248.html