JVM JRE JDK的关系
JVM 的内存机构:程序计数器 虚拟机栈 本地方法栈 堆 方法区
类加载器
作用:加载class文件
1 虚拟机在带的类加载器
2 启动类加载器
3 扩展类记载器
4 应用程序类加载器
类加载器在调用的时候是一层层的自下而上 4-》3-》2-》1
双亲委派机制:
- 类加载器受到类加载的请求
- 将这个请求向上委托给父类加载器去完成,一种向上委托,直到启动类加载起
- 启动加载器检查是否能够加载当前这个类,能加载就结束,使用的当前类加载器,否则,抛出日常,或者通知子加载器进行加载
JVM的位置
程序计数器
java指令的执行流程:
1 右侧的java源代码编译为左侧的java字节码(右侧第一个方块对应左侧第一个方块)
2 字节码 经过解释器 变为机器码
3 机器码就可以被cpu来执行
程序计数器的作用就是记住jvm指令的下一条指令的地址 0 3 4 5 6 9
虚拟机栈
一个方法的内存就是一个栈帧,方法会按照执行的顺序,顺序入栈。
栈内存溢出问题
方法过多
栈的内存过大
本地方法栈:
程序在调用本地方法中为其分配的空间地址
堆
用new方法栈创建的东西都会用到堆
堆的内存诊断:jps :当前系统中有哪些java进程
jmap-heap 进程id :查看堆内存的占用情况
三种JVm
Sun hotspot。
Heap :一个JVm只有一个堆内存。堆的内存大小是可以调节的。
GC垃圾回收,主要是在伊甸园区和养老区~ GC垃圾回收,主要是在伊甸园区和养老区~
假设内存满了,OOM,堆内存不够! java.lang.OutOfMemoryError: Java heap space在JDK8以后,永久存储区改了个名字(元空间); 假设内存满了,OOM,堆内存不够!Java.lang.OutOfMemoryError:在堆空间以后,永久存储区改了个名字(元空间JDK 8);
永久区
这个区域常驻内存的。用来存放JDK自身携带的Class对象。Interface元数据,存储的是Java运行时的一些环境或类信息~,这个区域不存在垃圾回收!关闭VM虚拟就会释放这个区域的内存~ 这个区域常驻内存的.用来存放JDK自身携带的类对象。接口元数据,存储的是运行时的一些环境或类信息~,这个区域不存在垃圾回收!关闭VM虚拟就会释放这个区域的内存~
一个启动类,加载了大量的第三方jar包。Tomcat部署了太多的应用,大量动态生成的反射类。不断的被加载。直到内存满,就会出现OOM; 一个启动类,加载了大量的第三方JAR包.Tomcat部署了太多的应用,大量动态生成的反射类.不断的被加载.直到内存满,就会出现OOM;
文章来源地址https://www.toymoban.com/news/detail-673243.html
默认情况下:分配的总内存是电脑内存的1/4,而初始化的内存:1/64 默认情况下:分配的总内存是电脑内存的1/4,而初始化的内存:1/64
如何解决oom问题
- 尝试扩大堆内存看结果
- 分析内存,看一下那个地方出现了问题(专业工具) (分析内存
新生区
·幸存区(form, to)。
老年区
JVM在进行GC时,并不是对这三个区域统一回收。大部分时候,回收都是新生代~·新生代 JVM在进行GC时,并不是对这三个区域统一回收。大部分时候,回收都是新生代~·新生代
GC回收算法
引用计数法:为每一个对象都配备一个计数器 将计数最小的的扔出去
文章来源:https://www.toymoban.com/news/detail-673243.html
GC复制算法
3 标记清除算法
到了这里,关于初识 JVM 01的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!