Java程序员:不识Jvm真面目,只缘身在增删查改中
### 前言
**JVM**是java的核心和基础,在**java**编译器和os平台之间的虚拟处理器。它是一种基于下层的操作系统和硬件平台并利用软件方法来实现的抽象的计算机,可以在上面执行java的字节码程序。
java编译器只需面向**JVM**,生成**JVM**能理解的代码或字节码文件。**Java**源文件经编译器,编译成字节码程序,通过**JVM**将每一条指令翻译成不同平台机器码,通过特定平台运行。
这里就给大家讲一下**JVM。**
**技术大咖带你垂直打击JVM**
1. 什么是运行时数据区? 我们一起来分享。
2. 了解JVM底层原理,让你的代码撸得飞起。
3. 搞定内存溢出,涨薪升职。
4. 涨见识,字节码执行过程分析。
5. 直击真相,原理和代码全都有。
6. 测试、效果演示及总结。
### JVM是什么?
**JDK**: java development kit (Java开发工具包) 编译、反编译、调试等。
**JRE**: java runtime enviroment (Java运行环境)
**JVM**: java Virtual Mechinal (Java虚拟机) 一次编写,到处运行!
![image.png](https://img-blog.csdnimg.cn/img_convert/a32d6590f9b7ba3f526b096788eb465e.png)
**学jvm的目就是:**
提升代码质量、解决项目问题。
面试!面试!还是面试!
### JVM是怎么玩的
类加载器:Class字节码文件加载到内存
执行引擎:解析字节码指令,得到执行结果
运行时数据区
![image.png](https://img-blog.csdnimg.cn/img_convert/24ab8f4fd29f9de88e50d68ffbb47378.png)
### JVM运行时数据区
**线程私有**
* 程序计数器
* 虚拟机栈
* 本地方法栈
**线程共享**
* 堆
* 方法区
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EoNFxj2e-1658982121438)(https://upload-images.jianshu.io/upload_images/19999858-270c7adfe8e0950d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]
### BAT的JVM面试题
**JVM什么情况下会发生栈内存溢出?**
![image.png](https://img-blog.csdnimg.cn/img_convert/7d482c8fe54ebedb8b49f31f5e7b2847.png)
**JVM中一次完整的GC流程是怎样的?**
* GC——垃圾回收
* 完整意味着有多种情况
### 程序计数器
**指向当前线程正在执行的字节码指令的地址(行号)**
### 栈是什么?
**栈(Stack)**
* 入口和出口只有一个
* 入栈
* 出栈
**FILO**
* 先进后出
![image.png](https://img-blog.csdnimg.cn/img_convert/eca3118e38297944d9764dd3fa1e696e.png)
### 虚拟机栈
**虚拟机栈**
创建一个线程就为线程分配一个虚拟机栈,它又会包含多个栈帧,因为每运行一个方法就创建一个栈帧。
* 运行时才有数据
**栈帧**
运行一个线程中的一个方法
* 局部变量表
* 操作数栈
* 动态连接
* 返回地址
![image.png](https://img-blog.csdnimg.cn/img_convert/b2ae7cb757052bfedfcb2d3c5f78bd20.png)
### 深入理解虚拟机栈
演示一段代码的方法的执行过程
**代码:**
> public int calc(){
>
> int a=100;
>
> int b=200;
>
> int c=300;
>
> return(a+b)*c;
>
> }
![image.png](https://img-blog.csdnimg.cn/img_convert/8cdbe13ca9c590547a4631dc4d6721c8.png)
### 虚拟机栈的异常
**StackOverFlowError异常**
* 原因:执行的虚拟机栈深度大于虚拟机栈允许的最大深度(方法的递归调用)。
* 解决办法:增加默认栈的容量。
栈容量 -Xss 默认1M
**OutOfMemeoryError异常**
* 原因:多线程环境下虚拟机在扩展栈时无法申请到足够的内存空间。
* 解决办法:减少默认栈的容量来换取更多的线程支持。
![image.png](https://img-blog.csdnimg.cn/img_convert/9ec04617a4d443bc0ddebcf0fd1f2899.png)
### JVM中线程共有的内存区域
**Java堆**
* Java堆是被所有线程共享的一块内存区域
* 所有的对象实例以及数组要在堆上分配
**元数据区**
* 老版本名称:方法区(永久代)
* 类信息、常量、编译后的代码信息
**直接内存**
![image.png](https://img-blog.csdnimg.cn/img_convert/3cf6b329d311957005fe54f44ec7bcd0.png)
以上源于一个视频讲解的概述总结,后续将分享后半部分的内容:
* 可达性分析算法——GC Roots
* JVM中的堆
* 新生代为什么分三个区?
* 新生代对象的分配和回收
* 老年代对象的分配和回收
* JVM中一次完整的GC流程是怎样的?
- 点赞
- 收藏
- 关注作者
评论(0)