当前位置: 首页 > news >正文

JVM-满老师

JVM

  • 前言
  • 程序计数器,栈,
    • 虚拟机栈:
    • 本地方法栈:
    • 堆,方法区:
      • 堆内存溢出
      • 方法区
      • 运行时常量池
    • 垃圾回收
    • 垃圾回收算法
      • 分代回收

前言

在这里插入图片描述
在这里插入图片描述
JVM 可以理解的代码就叫做字节码(即扩展名为 .class 的文件),它不面向任何特定的处理器,只面向虚拟机
在这里插入图片描述

程序计数器,栈,

程序计数器:作用,是记住下一条jvm指令的执行地址
线程私有的,不会存在内存溢出

虚拟机栈:

不需要垃圾回收
栈内存分配不是越大越好,越大,能分配的线程数会变少
在这里插入图片描述
活动栈帧,栈顶的那个栈帧(正在执行的那个方法)
在这里插入图片描述

栈内存溢出
栈帧过多导致栈内存溢出
比如递归方法反复调用自己,没有临界条件,只有一直入栈,没有出栈释放
在这里插入图片描述
栈帧过大导致栈内存溢出

本地方法栈:

本地方法,native method,不是有Java语言编写的代码,由C、C++编写的,本地方法调用的时候就放在本地方法栈

在这里插入图片描述

堆,方法区:

通过 new 关键字,创建对象都会使用堆内存
特点
它是线程共享的,堆中对象都需要考虑线程安全的问题
有垃圾回收机制

堆内存溢出

大量对象占据了堆空间,这些对象都持有强引用导致无法回收

解决办法

  • 使用Xmx参数指定一个更大的堆空间;
  • 由于堆空间不可能无限增长,分析找到大量占用对空间的对象,在应用程序上做出优化;

在这里插入图片描述
还有jvirsualvm

方法区

在这里插入图片描述
方法区(Method Area)被所有线程共享,用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

运行时常量池

  • 常量池,就是一张表,虚拟机指令根据这张常量表找到要执行的类名、方法名、参数类型、字面量等信息

  • 运行时常量池,常量池是 *.class 文件中的,当该类被加载,它的常量池信息就会放入运行时常量池,并把里面的符号地址变为真实地址

StringTable:

  • 常量池中的字符串仅是符号,第一次用到时才变为对象,用串池Stringtable(串池)的机制,来避免重复创建字符串对象
  • 字符串变量拼接的原理是 StringBuilder视频说明:s1+s2
  • 符串常量拼接的原理是编译期优化{“a"+“b”}

垃圾回收

1.可达性分析算法

  • Java 虚拟机中的垃圾回收器采用可达性分析来探索所有存活的对象
  • 扫描堆中的对象,看是否能够沿着 GC Root对象 为起点的引用链找到该对象,找不到,表示可以回收

在这里插入图片描述

  1. 强引用
    只有所有 GC Roots 对象都不通过【强引用】引用该对象,该对象才能被垃圾回收

  2. 软引用(SoftReference)
    仅有软引用引用该对象时,在垃圾回收后,内存仍不足时会再次出发垃圾回收,回收软引用对象,可以配合引用队列来释放软引用自身

  3. 弱引用(WeakReference)
    仅有弱引用引用该对象时,在垃圾回收时,无论内存是否充足,都会回收弱引用对象,可以配合引用队列来释放软引用自身

  4. 虚引用(PhantomReference)
    必须配合引用队列使用,主要配合 ByteBuffer 使用,被引用对象回收时,会将虚引用入队,由 Reference Handler 线程调用虚引用相关方法释放直接内存
    视频3分钟处:

  5. 终结器引用(FinalReference)
    无需手动编码,但其内部配合引用队列使用,在垃圾回收时,终结器引用入队(被引用对象暂时没有被回收),再由 Finalizer 线程通过终结器引用找到被引用对象并调用它的 finalize方法,第二次 GC 时才能回收被引用对象

垃圾回收算法

  • 标记清除(速度较快但会造成内存碎片)
  • 标记整理(无内存碎片但速度较慢)
  • 复制(不会有内存碎片需要占用双倍内存空间)

分代回收

在这里插入图片描述

http://www.lryc.cn/news/183798.html

相关文章:

  • 加锁常见的问题
  • 【LeetCode力扣】LCR170 使用归并排序的思想解决逆序对问题(详细图解)
  • python经典百题之一个素数能被几个9整除
  • Thymeleaf 内联语法使用教程
  • Django学习笔记-实现聊天系统
  • C++转换函数
  • Spring Boot中的@Controller使用教程
  • 【17】c++设计模式——>原型模式
  • 金三银四好像消失了,IT行业何时复苏!
  • PDF文件超出上传大小?三分钟学会PDF压缩
  • java入坑之国际化编程
  • Kafka客户端核心参数详解
  • 踩大坑ssh免密登录详细讲解
  • 操作系统八股
  • Hudi SQL DDL
  • gin 框架的 JSON Render
  • 《Dataset Condensation with Differentiable Siamese Augmentation》
  • 多普勒频率相关内容介绍
  • win10睡眠快捷方式
  • C++中的static和extern关键字
  • JAVA经典百题之找完数
  • CSS 滚动驱动动画 view-timeline-inset
  • ansible部署二进制k8s
  • Nginx限流熔断
  • QQ登录的具体流程
  • 用JMeter对HTTP接口进行压测(一)压测脚本的书写、调试思路
  • 接着聊聊如何从binlog文件恢复误delete的数据,模拟Oracle的闪回功能
  • 计算机竞赛 深度学习机器视觉车道线识别与检测 -自动驾驶
  • pyqt5使用经验总结
  • 【MQTT】mosquitto库中SSL/TLS相关API接口