java内存模型(2)

1、内存模型比较

java和C/C++的内存管理不同,c++是由程序员自己管理内存的,申请和释放;java是由虚拟机自动帮忙做的这些事,java程序员不要关心内存的问题。
但是产线总是会出现一些内存溢出/内存泄漏的问题,这个时候只有了解其原理,才能有效的解决问题。

2、java内存模型

主要有:

  • 方法区
  • java堆
  • java栈
  • 直接内存
    《java内存模型(2)》

类加载子系统

java类加载器把class字节码类加载到内存中,并初始化,具体加载过程后续章节中会讲到。

方法区

保存类信息、常量池、静态变量,字符串常量和数字常量。jdk8以后方法区变为元数据区。
git编译过后的机器码也会存在此处。

异常:
会产生OOM异常,特别是当程序中有动态代理生成动态类的时候(后续会讲),不断的产生新的类,溢出就会产生OOM异常;常量池满了也会溢出。
OOM:PermGen。JDK8以后:OOM:Metaspace

参数:

  • -XX:PermSize=50M 初始方法区大小
  • -XX:MaxPermSize=50M 最大方法区大小
  • -XX:MaxMetaspaceSize=50M 最大元数据区大小

java堆内存

保存对象数据,GC的主要目标。GC主要回收堆内存、直接内存、方法区内存。

异常:
java对内存溢出,是我们常见的问题。
主要就是OOM。

参数:
-Xmx2048M 最大堆内存
-Xms2048M 初始堆内存

栈内存

线程私有的内存信息,是一种先进后出的数据结构,分为3个部分:

  • java虚拟机栈:保存着java方法调用的信息,栈里面是一个一个栈帧
  • java本地方法栈:java本地方法调用的信息
  • PC寄存器:java方法运行的字节码地址,主要用于多线程切换时,恢复的当前线程执行指令

java虚拟机栈

保存着java方法调用的信息,栈里面是一个一个栈帧,一个方法调用就是一个栈帧。
生命周期和线程相同。
一个栈帧有以下几点信息:

  • 局部变量表:
  • 操作数栈
  • 帧数据区
  • 栈上分配
局部变量表

保存的是方法的参数和方法内部的局部变量。垃圾回收的主要跟节点
栈的大小是有限的,当一个线程方法调用层次过深的话,会发生异常,方法中的局部变量和参数会影响线程能够调用方法的深度。

操作数栈

保存操作时的中间数

帧数据区

保存常量的地址和异常信息

栈上分配

对于一些不能逃逸的对象,优化,使用栈内存分配
-XX:+DoEscapeAnalysis 开启逃逸分析
-XX:+EliminateAllocations 开启标量替换
-XX:-UseTLAB 关闭tlab

异常:
StackOverflowError,固定的栈内存时,申请进入新的方法,栈溢出异常
OOM:栈内存可动态增加时,当满了申请内存时,没有内存了,会抛出OOM

参数:
-Xss128K 栈的内存

本地方法栈

java本地方法调用的信息,
异常:
和java虚拟机栈类似,本地方法也会抛出StackOverflowError和OOM异常

PC寄存器

java方法运行的字节码地址,主要用于多线程切换时,恢复的当前线程执行指令。
程序的运行控制都依赖这个。
异常:
不会发生OOM异常

java直接内存

直接内存不属于堆内存,是直接使用的外部的内存,受系统内存限制。速度比对内存块。一般NIO中会用到。
异常:
当系统内存不足时,会抛出OOM异常。

3、内存溢出总结

java堆:

java.lang.OutOfMemoryError: Java heap space:对象太多且回收不掉

java虚拟机栈:

java.lang.StackOverflowError:调用方法层次太深
java.lang.OutOfMemoryError: Java stack space:栈内存满了,分配不到新的内存
java.lang.OutOfMemoryError: unable to create new native thread 内存没了,无法创建新的线程,创建线程过多

java本地方法栈:

和虚拟机栈一致

方法区:

java.lang.OutOfMemoryError: PermGen space:动态类过多或者常量池太多满了

直接内存:

java.lang.OutOfMemoryError:没有其他信息,且dump文件比较小

    原文作者:java内存模型
    原文地址: https://blog.csdn.net/denganming1214/article/details/82429553
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞