首页 > 娱乐前沿 > 热点
深入理解JVM之内存区域与内存溢出
佚名 2015-12-27 18:20:12

文章目录

  1. 1. Java内存区域与内存溢出异常
    1. 1.1. 运行时数据区域
      1. 1.1.1. 程序计数器
      2. 1.1.2. java虚拟机栈
      3. 1.1.3. 本地方法栈
      4. 1.1.4. Java堆(Java Heap)
      5. 1.1.5. 方法区
      6. 1.1.6. 运行时常量池
      7. 1.1.7. 直接内存
    2. 1.2. HotSpot虚拟机
      1. 1.2.1. 对象的创建
      2. 1.2.2. 对象的访问定位
    3. 1.3. OOM异常的解决思路
    4. 1.4. 参考

Java内存区域与内存溢出异常运行时数据区域

程序计数器java虚拟机栈本地方法栈

与虚拟机栈相似,主要为虚拟机使用到的Native方法服务,在HotSpot虚拟机中直接把本地方法栈与虚拟机栈二合一

Java堆(Java Heap)

java堆是被所有线程共享的一块内存区域,在 虚拟机启动时创建。此区域的唯一目的就是存储对象实例。java堆是垃圾收集器管理的主要区域。java堆还可以细分为:新生代与老年代。在细一点有 Eden空间、Form Survivor空间、To Survivor空间等。

方法区运行时常量池直接内存HotSpot虚拟机对象的创建

虚拟机遇到一条new指令时,首先将去检查这个对象的参数是否在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,必须先执行类的加载过程。
在类加载检查通过后,虚拟机将为新生对象分配内存。对象所需内存大小再类加载完成后便可确定。内存分配可以采用“指针碰撞”与“空闲列表”的方式。

对象的访问定位

java程序需要通过栈上的reference数据来操作堆上的具体对象。访问方式有使用句柄和直接指针两种。

OOM异常的解决思路

生成Dump快照文件:

先通过内存映像分析工具(如Eclipse的Memory Analyzer)进行分析,常见的情况有:

OOM异常示例:

package oom;
import java.util.ArrayList;
import java.util.List;
/**
 * VM Args: -Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError
* @ClassName: HeapOOM 
*
 */
public class HeapOOM {
    static class OOMObject{
    }
    public static void main(String[] args) {
        List<OOMObject> list = new ArrayList<OOMObject>();
        while(true){
            list.add(new OOMObject());
        }
    }
}

上一篇  下一篇

I 相关 / Other

我做了一座超美的山,它是一个合成器……

我做了一座山,它是一个合成器&#8230;仔细算下来,刨去早期的构思,我真正开工到结束,一共用了 11 周完成的

40个重要的HTML5面试问题及答案

本文由玩赚乐(www.banghui.org)– 小峰原创翻译,转载请看清文末的转载要求,欢迎加入技术翻译小组!本文将

飞行游戏的王者,到如今已经整整20年了

2015 年 12 月初,PS Experience 会议公布了多款对应 PSVR 的游戏,其中最受瞩目的作品莫过于《皇牌空战 7》

嫩模杨荧性感衬衣写真

大胸嫩模酒店性感写真

I 热点 / Hot