初识 JVM 01

JVM JRE JDK的关系

JVM 的内存机构:程序计数器 虚拟机栈 本地方法栈 堆 方法区

类加载器

作用:加载class文件

1  虚拟机在带的类加载器

2  启动类加载器

3  扩展类记载器

4  应用程序类加载器

类加载器在调用的时候是一层层的自下而上 4-》3-》2-》1

双亲委派机制:

  1. 类加载器受到类加载的请求
  2. 将这个请求向上委托给父类加载器去完成,一种向上委托,直到启动类加载起
  3. 启动加载器检查是否能够加载当前这个类,能加载就结束,使用的当前类加载器,否则,抛出日常,或者通知子加载器进行加载

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;

 

默认情况下:分配的总内存是电脑内存的1/4,而初始化的内存:1/64 默认情况下:分配的总内存是电脑内存的1/4,而初始化的内存:1/64

如何解决oom问题

  1. 尝试扩大堆内存看结果 
  2. 分析内存,看一下那个地方出现了问题(专业工具) (分析内存

新生区

·幸存区(form, to)。

老年区 

JVM在进行GC时,并不是对这三个区域统一回收。大部分时候,回收都是新生代~·新生代 JVM在进行GC时,并不是对这三个区域统一回收。大部分时候,回收都是新生代~·新生代

GC回收算法

引用计数法:为每一个对象都配备一个计数器  将计数最小的的扔出去

 

GC复制算法

 

 3  标记清除算法 

 

 

 

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值