java什么情况会导致内存溢出,内存溢出是一种java异常

  java什么情况会导致内存溢出,内存溢出是一种java异常

  00-1010 1.运行时数据区1。程序计数器(线程私有)2.Java虚拟机堆栈(线程私有)3。本地方法堆栈(线程私有)4.Java堆(线程共享)5。方法区域(线程共享)6。运行时常量池2。对象是如何创建的?3.对象的内存布局4。对象1的访问位置。手柄入口2。直接指针访问。1.Java堆溢出2的OutOfMemoryError异常代码演示。虚拟机堆栈溢出摘要

  

目录

 

  00-1010当前线程执行的字节码的行号指示符,分支、循环、跳转、异常处理、线程恢复等基本功能。必须由程序计数器测试。(记住程序当前走到的位置,下次还回来).线程私有。

  00-1010与方法相关联,每个方法都会创建一个堆栈框架来存储局部变量表、操作数堆栈、动态链接、方法出口等信息。每个方法从调用到执行的过程,对应的是一个栈帧在虚拟机栈中被堆栈和卸载的过程。

  所请求线程的堆栈深度大于虚拟机允许的深度,将引发StackOverflowError异常(过多的递归层通常会导致“堆栈爆炸”)。

  00-1010类似于Java虚拟机栈。不同的是:

  栈为虚拟机执行Java方法,本地方法栈为虚拟机使用的本地方法服务。

  一开始,Java通过Java原生接口(一般用C语言编写)调用本地方法

  00-1010 Java虚拟机管理的内存中最大的新对象存在于堆上垃圾收集器管理的主区域。

  00-1010存储已经由虚拟机加载的类信息、常量和静态变量。

  00-1010方法区域的一部分用于存储编译时生成的各种文字量和符号引用。

  00-1010 object obj=new object():分析这行代码的执行过程。

  使用new关键字,检查该指令的参数是否可以在常量池中定位类的符号引用,并检查该符号引用表示的类是否已被加载、解析和初始化。如果没有,首先加载类。类加载检查通过后,虚拟机将为新对象分配内存。内存分配完成后,虚拟机需要初始化为零值所有分配的内存空间。虚拟机应该对对象进行必要的设置,比如存储哈希码、元数据、GC生成年龄、是否使用偏置锁等。在对象头中执行init方法,并根据程序员的意愿初始化对象(给成员变量赋值)。

  

1. 运行时数据区域

 

  

1. 程序计数器(线程私有)

 

  

2. Java虚拟机栈(线程私有)

将Java堆分成一个内存作为句柄池。reference存储对象的句柄地址,句柄包含对象实例数据和类型数据的具体地址信息。

 

  

3. 本地方法栈(线程私有)

Java堆对象的布局中,需要考虑如何放置访问类型数据的相关信息,对象的地址直接存储在引用中。

 

  二者比较:

  使用句柄访问的最大好处是稳定的句柄地址存储在引用中。即使移动了对象(GC进程),也只需要改变句柄中的样本指针。引用的直接指针访问法最大的优点是速度更快。引用直接指向实例数据,因此减少了一次指针访问。

  HotSpot虚拟机使用直接指针访问对象。

  

4. Java堆(线程共享)

 

  

5. 方法区(线程共享)

包jvm导入Java . util . ArrayList;导入Java . util . list;public class out of memory error demo { static class my object { } public static void main(String[]args){ listmoyobject list=new ArrayList();int I=0;while(true){ system . out . println(I);list . add(new my object());}}}

 

  Java堆的大小限制在20MB,不可扩展(将堆的minimum -Xms参数设置为与maximum -Xmx参数相同可以避免堆自动扩展)。使用参数-xx3360 heapDumppoontoffmemoryerror,虚拟机可以在出现内存溢出异常时转储当前内存堆转储快照,以供以后分析。

  00-1010如果线程请求的堆栈深度大于虚拟机允许的最大深度,将抛出StackOverflowError异常。

  包jvm导入Java . util . ArrayList;导入Java . util . list;public class out of memory error demo { static int I=0;public static void main(String[]args){ f();} public static void f(){ system . out . println(I);f();}}

  在相同的Xss(线程的堆栈大小)下,如果堆栈中的本地数据越多,对应的递归次数就越少。

  另一种堆栈溢出会报告OutOfMemoryError异常。如果虚拟机在扩展堆栈时不能申请足够的内存空间,就会抛出OutOfMemoryError异常。比如上面的递归改成多线程版本就会出现这种问题。

  

6. 运行时常量池

本文到此为止。希望它能帮到你,也希望你能多关注更多的盛行它的内容!

 

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: