码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 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 时才能回收被引用对象

    垃圾回收算法

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

    分代回收

    在这里插入图片描述

    垃圾回收器

    在这里插入图片描述

  • 相关阅读:
    leetcode 剑指offer51:数组中的逆序对 归并排序
    websocket链接断开服务器报错java.io.EOFException解决办法
    算法入门(六):归并排序
    【Pandas总结】第二节 Pandas 的数据读取_pd.read_csv()的使用详解(非常全面,推荐收藏)
    SpringCloud微服务实战——搭建企业级开发框架(三十八):搭建ELK日志采集与分析系统
    ETL:数据转换与集成的关键过程
    未来各职业的人,都会涌入Python和AI大潮中,老教授深度解析
    .net如何优雅的使用EFCore
    什么是SVN(Subversion)?
    【开题报告】基于SpringBoot的医疗器械出入库系统的设计与实现
  • 原文地址:https://blog.csdn.net/weixin_44805103/article/details/133546454
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号