jvm是java的虚拟机,它的作用是: 让java可以跨平台,因为在下载jdk的时候,可以选择各种版本的jdk,其实里面就有着不同的jvm,这样在编译java文件的时候, 同样一个字母 "word",可能不同的虚拟机编译出来的字节码就是不一样的,这样才能让其在不同的平台都可以运行起来,相当于在jvm层做了一个 适配功能,这就是jvm;

image.png

java 运行代码的大致过程如图:
1 将编译好的字节码文件,通过类装子系统加在到jvm内存中(运行时数据区)
2 然后通过字节码执行引擎 执行

然后细说一下栈:
栈 是存放每个 方法 的 局部变量用的 (因为局部变量只在方法内部生效)一块专属区域;
一个方法对应一块 栈 的内存区域,每个内存中放着该方法的局部变量;
类似于数据结构中的 "栈" FILO ,先进后出,这个两个栈 其实有联系的,jvm中的栈其实就是这个数据结构,例如 我运行一个main方法,然后还有个子方法,那么 加在顺序其实是 先加在main方法,然后加载那个子方法,然后 子方法是先执行, main方法是后执行的!!! 所以数据结构是完全一致的;

程序计数器:
记录方法区运行时候的运行的方法的具体行号(标识);
为什么要记录这个方法运行时候的行号呢?? 例如 当多线程的时候,运行方法的时候,当前方法线程被挂起,然后下次被唤醒继续运行的时候,程序计数器就是指示继续运行的行号!!!
程序计数器的执行的行号更新,就是由正在执行的字节码的 字节码执行引擎, 每次执行每行代码的时候,修改程序计数器的行号

image.png

方法区:
字节码加在的位置: 包括 常量 静态变量 静态类;

堆:
当栈中的方法中的局部变量为对象的时候, 那么栈中存放的不在是对象本身,而是存储对象的内存地址,也就是堆中的内存地址(可以理解为你家的门牌号) ,那么 也就是 栈可能会有很多引用指向堆,堆中放的是对象;
当 方法区中有静态的变量是类 的时候,那么对象存储在堆中,类信息中放入的也是对象的内存地址,那么也可能会有很多引用指向堆

image.png

垃圾收集:
堆中放入的new出来的对象,那么程序不断运行,一直放入新增的对象到 伊甸园区, 当放满的时候,开始gc垃圾回收,大体过程是:
首先从有引用的对象开始找,一直找到最后,那么所有找的对象都被标记为非垃圾,这些对象会从伊甸园eden区域复制到survivor区域s0区域,对象的年代+1 ,eden区域剩余的对象是没有任何引用的对象,直接干掉! 此时堆已经空出来了,又能继续放新增的对象了,当放满后开始gc,此时继续从有引用的对象开始找,此次垃圾回收的对象不仅包括eden区域,还包括s0区域,当找到所有标记为非垃圾的对象,复制到s1 年代+1 ; 然后 剩余的eden和s0中的垃圾对象全部干掉; 当年代不断增加,到达15 的时候,会放入到老年代中;
当老年代满了 就会开始full gc 也就是老年的垃圾回收;

调优工具
就是这个

image.png

打开后安装一个插件,直接下载不行,弄个离线安装
「com-sun-tools-visualvm-m...dules-visualgc_1.nbm」https://www.aliyundrive.com/s/Z7oNBgPbpcc
点击链接保存,或者复制本段内容,打开「阿里云盘」APP ,无需下载极速在线查看,视频原画倍速播放。
下载后导入进来安装

image.png

开始跑java程序,然后就能监控到了

image.png

双击其中一个,就可以看到现象了;过程就是上述垃圾回收的过程

2022-06-23 JVM学习相关推荐

  1. 2022.06.23短学期mini2智行小车学习——初识ROS

    什么是ROS: 机器人操作系统(Robot Operating System),一般简称为 ROS,它是一个应用于机器人之上的操作系统. 目前越来越多的机器人.无人机甚至无人车都开始采用 ROS 作为 ...

  2. 日迹2022/06/23

    1 改变layui表单的数值后,需要使用layui.render(),重新渲染表单 form.render('type'); //更新全部表单数据 form.render('select ');刷新s ...

  3. vue日迹2022/06//23

    1.prop 搭配 watch 父组件 在子组件risksource中传值guid 子组件 在prop中接收guid,使用watch监听 使用参数immediate 立即监听 2.集合多个组件一同抛出 ...

  4. Java虚拟机JVM学习06 自定义类加载器 父委托机制和命名空间的再讨论

    Java虚拟机JVM学习06 自定义类加载器 父委托机制和命名空间的再讨论 创建用户自定义的类加载器 要创建用户自定义的类加载器,只需要扩展java.lang.ClassLoader类,然后覆盖它的f ...

  5. 2022年最新Java学习路线图

    2022年最新Java学习路线图 守静笃,花自开! 总时长:225:33:17 226小时 / 8小时·每天 = 29天 29天 * 3倍时间 = 3个月 超链接 点击跳转狂神说kuangstudy ...

  6. JVM学习教程,带你轻松掌握Java虚拟机,吊打面试官

    前言: Java 虚拟机日益成为互联网大厂面试的重要内容,对于 Java 开发者而言,只有在了解 Java 背后的原理后,才能写出更高质量的代码,才能在错综复杂的 bug 中快速定位出问题并找到解决方 ...

  7. java虚拟机预先加载哪些类_Java虚拟机JVM学习02 类的加载概述

    Java虚拟机JVM学习02 类的加载概述 类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对 ...

  8. JVM学习笔记(Ⅰ):Class类文件结构解析(带你读懂Java字节码,这一篇就够了)

    JVM学习笔记(Ⅰ):Class类文件结构解析,带你读懂Java字节码 前言:本文属于博主个人的学习笔记,博主也是小白.如果有不对的地方希望各位帮忙指出.本文主要还是我的学习总结,因为网上的一些知识分 ...

  9. 人工智能 | ShowMeAI资讯日报 #2022.06.18

    ShowMeAI日报系列全新升级!覆盖AI人工智能 工具&框架 | 项目&代码 | 博文&分享 | 数据&资源 | 研究&论文 等方向.点击查看 历史文章列表, ...

  10. 2022.06.26 华为od机试真题

    华为od机试真题 1.最长连续子串 2.正方形数量 3.二叉树层次遍历(不会做) 1.最长连续子串 有N个正整数组成的一个序列给定一个整数sum求长度最长的的连续子序列使他们的和等于sum返回次子序列 ...

最新文章

  1. 解决 win10 pycurl安装出错 Command python setup.py egg_info failed with error code 10 编译安装包 安装万金油...
  2. 业界盘点|为什么推荐算法都开始结合图神经网络了?
  3. Linux MISC 驱动实验
  4. 获取指定路径下的所有文件
  5. 盘点旷视14篇CVPR 2019论文,都有哪些亮点?
  6. 、简述global关键字的作用_二十三、Python变量作用域(局部变量和全局变量)
  7. html巡检脚本,WEB服务器巡检脚本
  8. Linux基础—1.Linux系统(CentOS6.7)详细安装过程
  9. hyper-V管理器构建win7虚拟机
  10. 微信背后的产品观 - 张小龙内部8小时演讲
  11. 动手学深度学习讲义批量下载
  12. 微信支付开发(1)--普通商户申请、账户验证、签约、公众号授权流程详解
  13. MySQL gtid purge_MySQL中set gtid_purged的行为变更及对备份恢复的影响
  14. 简单实用的vue常用后台管理模板框架
  15. 京东企业注册HTML
  16. 微信公众平台开发入门教程
  17. python 散点密度图,分组散点密度图的三种实现方法
  18. 百倍加速:Python量化策略的算法性能提升指南
  19. Android使用SharedPreferences存储数据
  20. 360卫士 是 木马?

热门文章

  1. 管理员必备的20个Linux系统监控工具
  2. 最小费用流bellman-ford算法总结
  3. 空间管理系统有哪些管理模块?
  4. 【求职】小米 2018 秋招测试开发工程师笔试题
  5. 虚拟现实、增强现实与全息投影的区别
  6. 震惊!为了欣赏后宫的3000佳丽,我竟然用Python做出了一面墙?
  7. NVME Reset
  8. MySQL求百分比带百分号%
  9. 鼠标指针(光标)变成黑方块的解决方法
  10. mysql创建日历表,可以按日或按月增加数据