放大啦资源网 http://www.fangdala.com
当前位置首页 > 百科资料> 正文

java内存溢出

2023-02-15 21:06:44 暂无评论 百科资料

1.1 程序计数器 记录当前线程所执行字节码的行号指示器。线程私来自有,占有很小一块内存环不备历,唯一一块没有OutOfMemoryError的区域。

  • 中文名 java内存溢出
  • 本地方法栈 本地方法Native,HotSpot等
  • 程序计数器 记录当前线程所执行字节码
  • 虚拟机栈 描述的是Java方法执行的区域

数据区域

程序计数脚剂设认房研百

  记录当前线灯作程所执行字节码的行号指示器。线程私有,占有很小一块内存,唯一一块没有OutOfMemoryError的区域。

java虚拟机栈

  线程私有,生命周期与线程一样,描述的是Java方法执行的区域:每个方法被执行就回生成一个栈帧(Stack Frame)用于存储局部变量表,操作栈,动态链接,方法出口等信息。

 来自 局部变量表存储编译器可知的各种基本数据类型(boolean byte char short int float long double)对象引用(reference)和returnAddress类型,其中float和double占用两个局部变量空间Slot,其余占用一个

  两种异常:线程请微顺具木作分西养试教刘求的深度大于虚拟机允许深度,StackOverFlowEr360百科ror,

  无法申请到足够的空间:OutOfMemoryError

本地方法栈

  与虚拟机栈的作用相同,只不过执行的是本地方法Native,HotSpot胶块践序友期什把java虚拟机栈和本地方法栈合二为一。

  盾接损够类现无法申请到足够的空间:OutOfMemoryError  unable to cteate new native thread

java堆java Heap

  是内存中占用最大的一块,被所有线程共享。所有的对象实例和数组都在这上面分配,但是随着JIT编译器的发展和逃逸技术的成熟等,也不是那么绝对了。

  Java堆是内层哥交型杂套生画存回收的主要区域,也成为“GC堆”(Garbage Collected Heap)

  如命传角美境井善物它果无法申请到足够的系督祖般督空间抛出OutOfMemo米情贵ryError : Java heap space

方法区

  用来存储虚拟机加载的类信息,常量,静态常量,即时编译器编译后的代码等。也就是平时大家绝规着练空煤说的永久代,本质上并不等价,或者说使用永久连副混烟紧代实现方法区而已。一多务注敌蒸别月般方法区内存回收成绩不令人满意。

  上买如果如法申请到足够的空间抛出OutOfMemoryError :Pe本声弦元介rmGen space

运行时常量池 Runtime Constant 较应Pool

  是方法区的一部分,Class文件除了有类的版本信息、字段方法接口外,还有一项信息是常量池,用于存放编译器生成的各种字面量和符号引用,这部分信息在类加载后存放到方法区的运行时常量池中。

 婷养排念京定 具有动态性,可以使用String类的intern()方法加入。

直接内存

  并不是虚拟机运行时数据区的一部分。JDK1.4中引入了NIO类,引入了一种基于通道与缓冲区的I/O方式,可以使用Native直接分配堆外内存,避免了再Java堆和Native堆中来回复制数据。

  不会受到Java堆内存限制,但会受到机器总内存的限制。

  如果如法申请到足够的空间抛出OutOfMemoryError

对象访问

  Object obj = new Object();

  Object obj 会反映到java栈的本地变量表中,作为一个reference数据类型出现。New Object 会反映到堆中。Reference规定了一个指向对象的访问,主流访问方式有两种:

  ·句柄访问,java堆中专门开辟出一块句柄池,reference指向句柄池,句柄池中包含了实际的对象地址,优点:reference稳定不用更改。

  ·直接访问,reference直接指向对象,优点:速度快,Hotspot采用这种方式 。

异常

Java堆异常

  堆的最小值:-Xms 如-Xms20m

  堆的最大值  -Xmx 如果设为一样的则可避免堆自动扩展。

  年轻代大小: -Xm盐银常件n

  -XX:+He设德处数各apDumpOnOutOfMemoryError 当内存溢来自出时Dump出当前的内存堆转存快照。

  Eclipse中虚拟机参数设置:debug As-->open dubug dialog

  生成之后使用Eclipse Memory 整提科积贵增压用气展具Analyzer 进行堆360百科转储文件分析(需要安装MAT插件)。

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

  -Xss:设置又封置攻十稳客浓组决每条线程的Statck大小.在JDK1.5以后默认是1M,之前是256K

  抛出StackOverFlow异助怕谁伯是常:操作系统分配给每个线程的内存是有限的,机器总内存减去Xmx再减去MaxPermSize,程序计数器占内存很少忽略,剩下的内存被虚拟机栈和本地方法栈瓜分,每个线程分到的栈容量越大,分配的线程数就小。正常情况栈深度1000-2000没问题,如果是建立更多线程导致的内存溢出,在不能减少线程的情况下,只能通过减小Xmx和栈容量来换取更多线程。

唱东多方法区和运行时常量池溢出

  -PermSize :方法区的初始容量,默认是物理内存的1/64

  -MaxPermSize :最大方法区容量。

本机直接内存溢出

  -XX:MaxDirectMemorySize 本机直接内存大小,如果不指定,则与Xmx一样

猜你喜欢