JVM学习

32 阅读4分钟

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」www.aliyundrive.com/s/Z7oNBgPbp…
点击链接保存,或者复制本段内容,打开「阿里云盘」APP ,无需下载极速在线查看,视频原画倍速播放。
下载后导入进来安装

image.png

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

image.png

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

本文转自 jimolvxing.blog.csdn.net/article/det…,如有侵权,请联系删除。