zoukankan      html  css  js  c++  java
  • Java内存区域与内存溢出异常

    1 运行时数据区域

    如图,Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。

    • 程序计数器、虚拟机栈、本地方法栈是线程私有的。
    • 堆和方法区是所有线程共享的,在虚拟机启动时创建。
    • 程序计数器是一块较小的内存空间,可以当作当前线程所执行的字节码的行号指示器。
    • 虚拟机栈描述的是Java方法执行的线程内存模型,为虚拟机执行Java方法(也就是字节码)服务。
    • 本地方法栈与虚拟机栈类似,不同之处在于本地方法栈为虚拟机使用本地方法服务。
    • Java堆是虚拟机所管理的内存中最大的一块,用于存放对象实例。
    • 方法区用于存储已经被虚拟机加载的类型信息、常亮、静态变量、即时编译器编译后的代码缓存等数据。
      运行时常量池是方法区的一部分。
    • 直接内存并不是虚拟机运行时数据区的一部分。

    2 对象的内存布局

    在HotSpot虚拟机里,对象在堆内存中的存储布局可以划分为三个部分:对象头(Header)、实例数据(Instance Data)对齐填充(Padding)

    • HotSpot虚拟机对象的对象头包括Mark Word类型指针。Mark Word存储对象自身运行时数据;类型指针指向它的类型元数据的指针,java虚拟机通过这个指针来确定该对象是哪个类的实例。
    • 实例数据是对象真正存储的有效信息,即我们在程序代码里定义的各种类型的字段内容,无论是从父类继承下来的,还是在子类中定义的。
    • 对齐填充不是不然存在的,也没有特别含义,仅起着占位符的作用。

    3 实战:OutOfMemoryError异常

    在《Java虚拟机规范》的规定里,除了程序计数器,其他几个运行时区域都有可能发生OutOfMemoryError(下文称OOM)异常的可能。

    3.1 Java堆溢出

    代码:Java堆内存溢出异常测试

    /**
     * VM Args: -Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError
     * 限制Java堆的大小为20MB,不可扩展(将堆的最小值-Xms参数与最大值-Xmx参数设置为一样即可避免堆自动扩展)
     * 通过参数-XX: +HeapDumpOnOutOfMemoryError可以让虚拟机在出现内存溢出异常时Dump出当前内存堆转储快照以便进行事后分析
     * eclipse里在Run/Debug的Configuration里设置VM参数
     * @author ZS
     *
     */
    import java.util.*;
    
    public class HeapOOM {
    
    	static class OOMObject{
    	}
    	
    	public static void main(String[] args) {
    		List<OOMObject> list = new ArrayList<OOMObject>();
    		
    		while(true) {
    			list.add(new OOMObject());
    		}
    	}
    }
    

    运行结果:

    java.lang.OutOfMemoryError: Java heap space
    Dumping heap to java_pid10504.hprof ...
    Heap dump file created [28534534 bytes in 0.158 secs]

    待补充:解决内存区域异常,使用内存映像分析工具(如Eclipse Memory Analyzer)对Dump出来的对转存储快照进行分析。

    3.2 虚拟机栈和本地方法栈溢出

    3.3 方法区和运行时常量池溢出

    3.4 本机直接内存溢出

  • 相关阅读:
    prometheus — nginx-vts-exporter
    jenkins的sbt插件安装
    centos 踩坑集锦
    Prometheus — Process-exporter进程监控
    Prometheus 自定义exporter 监控key
    prometheus — 基于文件的服务发现
    Prometheus 企业微信报警/inhibit抑制 /静默(二)
    centos7-- sbt的安装使用
    prometheus + grafana + node_exporter + alertmanager 的安装部署与邮件报警 (一)
    nginx配置
  • 原文地址:https://www.cnblogs.com/s-zhou/p/14201768.html
Copyright © 2011-2022 走看看