JVM笔记1_java内存区域与溢出异常

来源:互联网 发布:软件日记 编辑:程序博客网 时间:2024/06/05 19:36

1,jvm的自动内存管理机制

2,jvm 运行时数据区域

      jvm在执行java程序的过程中将其管理的内存划分为

     方法区,存放已经被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据。当方法区无法满足内存分配,爆出outofmemoryerror,

                     运行时 常量池是方法区的一部分,用于存放编译器生成的各种字面量的和符号引用。

                     具备动态性 的特征;运行区间也可以将新的常量放入池中,String intern();

l     堆:在虚拟机启动时创建,唯一目的存放对象实例,是垃圾收集器(一般采用分代收集算法)管理的主要区域,逻辑上那连续,物理上不一定连续。如果没有足够的内存完                成实例化分配,并且堆不可扩展,则outofmemoryerror   

     由所有的线程共享的数据区

     虚拟机栈,描述的是java方法执行的内存模型:每个方法执行的时候都会创建一个stack Frame用于存储局部变量表,操作栈,动态链接,方法出口等信息。其中局部变量表

                        存放了编译期可知道的各种、基本数据类型,所需要的内存空间在编译期间已经分配完成,在方法运行期间不会改变局部变量表的大小。

                        如果线程请求的栈深度大于虚拟机允许的深度,stackoverflowerror

                        如果虚拟机栈在扩展申请不到足够的内存空间,outofmemoryerror

    本地方法栈,虚拟机栈为执行java方法服务,本地方法栈为native方法服务。其他同虚拟机栈

    程序计数器,一块较小的内存空间,当前线程所执行的字节码文件的行号指示器,多线程中每个线程在执行程序是都需要一个程序计数器来记录上次程序执行到的位置。

                          执行java方法,正在执行的java字节码指令的地址

                           执行native方法,则程序计数器为undefined.

                          唯一规定没有outofmemoryerror的内存区域。

      线程隔离的数据区,

3,直接内存

4,  对象访问 

  Object obj  =new Object();

   java栈。堆

  句柄:堆中划分出句柄池,reference对象中存储的就是对象的句柄地址,句柄中包含对象的实例数据和类型数据各自的地址。


  直接指针:reference中直接存放的就是存储的对象地址。


5,各种outofmemoryerror

各个运行时数据区的存储数据类型

根据异常信息判断哪个区发生的异常

发生异常应该如何处理

 5.1 Java heap space :

      内存泄漏

      内存溢出

 5.2 stackoverflowerror

        outofmemoryerror

 5.3方法区溢出permgen space

 5.4直接内存溢出。并没有真正分配内存,只是计算可得溢出。



   

阅读全文
1 0