Java--JVM--栈(stack)和堆(heap)
- java 栈(java stack):
- 解释:
- 栈管运行,堆管存储
- 程序=算法+数据结构
- 程序=框架+业务逻辑
- 队列(FIFO)
- 栈(FILO)
- java 方法 = 栈 帧,在java中叫main 方法,进入栈中叫 栈帧
- 栈是什么
-
栈存储什么
-
八种数据类型,对象的引用变量(开辟的栈帧是方法的一次执行过程) ,指向方法的引用
-
栈帧(方法中)中主要保存3类数据:
-
本地变量(Local Variables) :输入参数和输出参数以及方法内的变量
-
栈操作(Operand Stack) : 记录出栈、入栈的操作;
-
栈帧数据(Frame Data) :包括类文件、方法等等(八种基本类型的变量,对象的引用,方法的引用)
-
- 局部变量,实例方法,对象的引用
-
- 栈的运行原理
-
栈出现的错误(Error级别的错误):栈内存溢出异常(SOF):Exception in thread "main" java.lang.StackOverflowError
- 解释:
-
堆+栈+方法区交互的关系
-
栈中存储:八种基本数据类型(byte,short,int ,long ,float,double ,bloon,char,boolean)+对象的引用(reference)+指向方法的引用 (对象的引用指向堆)
- 堆中保存了: 对象的实例 (指向方法区中的对象结构信息)+实例变量
- 方法区中保存了:类的结构信息(类的模板),静态 方法和变量,常量
- JDK的名字=HostSpot
-
-
堆(Heap)
- 分类
-
新生代(NEW)
- 伊甸区
- 幸存者0区
- 幸存者1区
-
老年代(OLD)
-
元空间
-
永久代
- java 8 逻辑上分为:新生区,养老区,元空间
- java 8 物理上分为:新生区,养老区
- java 7逻辑上分为: 新生区,养老区,永久存储区
- java 7 物理上分为:新生区,养老区
-
-
是什么
-
新生区,养老区,元空间
-
新生区:
-
伊甸区
-
幸存者0区(S0)别名:from
-
幸存者1区(S1)别名: to
-
- 分类
-
堆参数调优
-
JDk7
-
-
jdk8 (OOM :对内存溢出)
- JVM调优简介
-
堆逻辑上分为:新生区,养老区,元空间
-
物理上分为:新生区,养老区
-
-
配置参数演示和堆的内存证明:
- 从对空间内存=新生区内存+养老区内存 ,可以看出物理上堆没有包括元空间,且配置的参数生效
-
模拟栈内存溢出错误
-
package com.model.jvm; public class Test03 { public static void main(String[] args) { // Runtime.getRuntime(): -> JVM运行时数据区的对象 System.out.println(Runtime.getRuntime().availableProcessors()); Long maxMemory=Runtime.getRuntime().maxMemory(); //返回java虚拟机的试图使用的最大内存量 Long totalMemory=Runtime.getRuntime().totalMemory(); //放回虚拟机的总内存量 System.out.println("-Xmx:MAX_MEMORY="+maxMemory+"(字节);"+(maxMemory/(double)1024/1024)+"MB"); System.out.println("-Xms:TOTAL_MEMORY="+totalMemory+"(字节);"+(totalMemory/(double)1024/1024)+"MB"); } }
-
-
GC日志信息分析
-
GC日志详情
- [GC (Allocation Failure) [PSYoungGen: 1973K->480K(2560K)] 1973K->771K(9728K), 0.0418826 secs] [Times: user=0.00 sys=0.00, real=0.06 secs]
-
Full GC日志详情
-
[Full GC (Allocation Failure)
-
[PSYoungGen: 0K->0K(2048K)]
-
[ParOldGen: 4207K->4187K(7168K)] 4207K->4187K(9216K),
-
[Metaspace: 3227K->3227K(1056768K)], 0.0063580 secs] [Times: user=0.02 sys=0.00, real=0.01 secs]
-
-
-