JVM执行流程:
JVM运行时数据区域:
堆:线程共享的区域,保存程序创建的对象(是对象,而不是变量)
同过JVM运行参数可以设置堆的最大内存和最小内存:
-Xms10m最小堆内存 -Xmx20m最大堆内存
java -Xms10m -Xmx20m Main
在进行GC时,会将堆划分为老年代和新生代两个区域,而新生代区域又会被划分为三块8:1:1的区域,分别为伊甸区(Eden),两个幸存区(Survivor)
方法区:线程共享,用来存放被虚拟机加载的类信息(.class的字节码文件进行类加载),比如常量,静态变量等,即是编译后的代码数据,且堆中会生成一个类对象
类加载的过程:
Java虚拟机栈:生命周期和线程相同,属于线程私有,每一个方法执行时都会创建一个栈帧进栈,结束后出栈
栈帧:方法执行时创建
本地方法栈:和Java虚拟机栈类似,只不过是为本地方法使用的栈,即调用一些Native方法则会使用本地方法栈保存栈帧
程序计数器:用来记录当前代码执行的行号
除了程序计数器外,其它的运行时区域都可能会产生OOM,即内存溢出
内存溢出:存放的数据大小超过该区域的内存大小
内存泄漏:由于线程生命周期过长导致一些不会被引用的数据未被GC回收,导致可用空间越来越小,可能会导致内存溢出
解决内存溢出:
StackOverflow:虚拟机栈和本地方法栈溢出,由于入栈的栈帧数量过多,栈的深度超过JVM规定的最大深度,导致此错误,可能原因是不合理的递归