前言
JVM是java的核心和基础,在java编译器和os平台之间的虚拟处理器。它是一种基于下层的操作系统和硬件平台并利用软件方法来实现的抽象的计算机,可以在上面执行java的字节码程序。
java编译器只需面向JVM,生成JVM能理解的代码或字节码文件。Java源文件经编译器,编译成字节码程序,通过JVM将每一条指令翻译成不同平台机器码,通过特定平台运行。
这里就给大家讲一下JVM。
技术大咖带你垂直打击JVM
-
什么是运行时数据区? 我们一起来分享。
-
了解JVM底层原理,让你的代码撸得飞起。
-
搞定内存溢出,涨薪升职。
-
涨见识,字节码执行过程分析。
-
直击真相,原理和代码全都有。
-
测试、效果演示及总结。
JVM是什么?
JDK: java development kit (Java开发工具包) 编译、反编译、调试等。
JRE: java runtime enviroment (Java运行环境)
JVM: java Virtual Mechinal (Java虚拟机) 一次编写,到处运行!
学jvm的目就是:
提升代码质量、解决项目问题。
面试!面试!还是面试!
JVM是怎么玩的
类加载器:Class字节码文件加载到内存
执行引擎:解析字节码指令,得到执行结果
运行时数据区
JVM运行时数据区
线程私有
-
程序计数器
-
虚拟机栈
-
本地方法栈
线程共享
-
堆
-
方法区
BAT的JVM面试题
JVM什么情况下会发生栈内存溢出?
JVM中一次完整的GC流程是怎样的?
-
GC——垃圾回收
-
完整意味着有多种情况
程序计数器
指向当前线程正在执行的字节码指令的地址(行号)
栈是什么?
栈(Stack)
-
入口和出口只有一个
-
入栈
-
出栈
FILO
- 先进后出
虚拟机栈
虚拟机栈
创建一个线程就为线程分配一个虚拟机栈,它又会包含多个栈帧,因为每运行一个方法就创建一个栈帧。在此我向大家推荐一个架构学习交流圈。交流学习伪鑫:1253431195(里面有大量的面试题及答案)里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化、分布式架构等这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多
- 运行时才有数据
栈帧
运行一个线程中的一个方法
-
局部变量表
-
操作数栈
-
动态连接
-
返回地址
深入理解虚拟机栈
演示一段代码的方法的执行过程
代码:
public int calc(){
int a=100;
int b=200;
int c=300;
return(a+b)*c;
}
虚拟机栈的异常
StackOverFlowError异常
-
原因:执行的虚拟机栈深度大于虚拟机栈允许的最大深度(方法的递归调用)。
-
解决办法:增加默认栈的容量。
栈容量 -Xss 默认1M
OutOfMemeoryError异常
-
原因:多线程环境下虚拟机在扩展栈时无法申请到足够的内存空间。
-
解决办法:减少默认栈的容量来换取更多的线程支持。
JVM中线程共有的内存区域
Java堆
-
Java堆是被所有线程共享的一块内存区域
-
所有的对象实例以及数组要在堆上分配
元数据区
-
老版本名称:方法区(永久代)
-
类信息、常量、编译后的代码信息
直接内存
以上源于一个视频讲解的概述总结,后续将分享后半部分的内容:
-
可达性分析算法——GC Roots
-
JVM中的堆
-
新生代为什么分三个区?
-
新生代对象的分配和回收
-
老年代对象的分配和回收
-
JVM中一次完整的GC流程是怎样的?