JVM的部分知识点汇总 (一)

91 阅读3分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

前言

最近网上看文章,b站看视频,各种知乎、csdn、简书乱逛,疯狂恶补JVM的知识。没办法谁叫这是底层的东西,进大厂就得沉下心来好好学习这些底层内容。

image.png

Jvm是什么,学过java的人不会没人不知道吧,你上课老师一定讲过java是全平台使用的吧,那它的这个全平台你不好奇它是如何实现的?你好奇那就对了,java语言本身不和操作系统打交道,真正打交道的是JVm也就是java 虚拟机。它与操作系统之间没有关联,所以他可以全平台通用,当然你也就必须要安装jvm虚拟机,只有有了虚拟机你的代码才可以全平台运行。这里的全平台没讲好,应该是系统通用,也即是Linux or Windows 都可以使用,或者只要可以安装java虚拟机的设备都可以运行。

JVM运行时数据区域有五个内容:

程序计数器

  1. 较小的内存
  2. 当线程执行的字节码行号指示器
  3. 字节码指示器:通过改变这个计数器的值来选取下一条的指令,分支、循环、跳转、异常处理、线程恢复等功能都需要依赖计数器完成,比如:分支 if、循环 for、跳转 switch 4.如果执行的java方法,则记录字节码指令的地址,如果是Native方法,计数器值为空。native是不属于java代码的范畴了,我更喜欢把它叫做java调用c语言代码。
  4. 不会内存溢出

java虚拟机栈

  1. java虚拟机栈生命周期和线程相同
  2. 每个方法创建栈帧,栈帧存储局部变量表操作数栈动态链接方法出口等信息。类似idea断点后的左边debug栏的栈,每一项即为一个栈帧 经典的 StackOverflowError 和 OutOfMemoryError 错误就是在这里报错

stackoverflowerror: 线程请求的栈深度大于虚拟机允许的深度

OutOfMemoryError:栈拓展内存不够用,内存溢出

本地方法栈

Nativemethodstack(本地方法栈):保存native方法进入区域的地址。

java堆

这一块是jvm中占内存最多的一项,对象实例、数组、链表等存储就是在这个区域,在这个区域一般还会分为两个区域 新生代 和 老年代,而新生代又分为三个区域,eden 和 幸存一区 和 幸存二区,幸存一二区会经常调换,它们就像两个水桶,但是只有一个有水,然后有水的倒入没水的这样能保证肯定有一个桶没有水,这样做的好处就是减少了内存碎片。

永久代,方法区

这个地方是运行时常量池,属于共享内存的区域,存储已经被虚拟机加载的信息,静态变量,常量这些。

image.png

总结

  1. java的系统通用性是来自与它强大的虚拟机
  2. jvm是java的虚拟机,也就是运行环境
  3. jvm运行时数据区由五个部分组成