1.java virtual machine 管理的内存区域(5个)

                          

java虚拟机内存过高 java虚拟机的内存管理_局部变量

                                                       java运行时数据区

程序计数区

            当前线程所执行的字节码的行号指示器;

            每个线程均有一个PC,并且互相独立,互不影响。

            执行java方法(Java字节码)时,pc内容就是正在执行的字节码地址;

            执行native方法时,pc内容为空

   异常:OutOfMemoryError

java虚拟机栈

            用于存储局部变量表,操作栈,动态链接,方法出口等信息。

           方法的调用至完成的过程就对应着栈的push和pop过程。

           局部变量表用于存放编译时期可知的基本数据类型和引用类型(不是对象本身,是一个与该对象有关的地址,如指针或句柄),以及returnAddress类型。局部变量表在编译期完成分配,运行时不会改变。

  异常:StackOverflowError ,OutOfMemoryError

本地方法栈

       与虚拟机栈相似,区别在于虚拟机栈为jvm执行Java方法服务,本地方法栈为jvm执行native方法服务。

   异常:StackOverflowError ,OutOfMemoryError

堆(heap)

        jvm管理的最大的一块区域;

         jvm启动时就创建,被所有线程所共享;

        用于存放对象实例,即所有对象创建时都是在堆中创建的;

       是GC负责的主要区域;

       物理上可以不连续,逻辑上连续即可。

OutOfMemoryError,在堆上没有完成实例的创建,以及堆无法再扩展时。

方法区 (method area)

      各个线程所共享的内存区域;

     存储已被虚拟机加载的类信息,常量,静态常量,即时编译后的代码等数据;

     jvm规范将MA描述为Heap的一个逻辑部分,但其有一个别名:non-heap 以便与heap区分。

    内存可以不连续,大小可扩展,可以选择不实现垃圾收集,GC在MA中主要是针对常量池的回收;

异常:OutOfMemoryError

 运行时常量池(runtime constant pool ,rsp)

      方法区一部分;

     常量池用于存放编译器生成的各种字符常量和符号引用,但在类加载后,将这些信息存放到MA中的RCP中。

      与常量池相比,RCP具有动态特性,即可以在运行时将新的常量放入RCP中。如String中的intern()方法;