作者处于学习阶段,正在学习jvm,作为学生,我会用更通俗的说法,来叙述自己对jvm的了解。愿各位大佬看到有见解错误的地方和叙述不好的地方,能够帮忙纠正。来帮助大家更加深入的了解jvm。
一、jvm简单的引言和介绍
我们在学习过程中,大多数都是偏向于封装好的技术,学习各种各样的框架,好多人会忽视掉底层运行的学习,这样可能会导致在项目中遇到非代码性的问题不知从何解决,如线上系统卡死,报OOM的错误没有足够的内存、jvm的垃圾回收问题、新项目的jvm参数设置一窍不通。
在我们日常编写的程序都是在框架的基础上来编写的,而我们编写的程序是要经过许多层的转换,才能变成机器所能读懂的语言。平时编码所对应的结构图如图1所示:
图1
在我们日常的编程中,大多数的编程人员认为上层的框架才是学习的重点,这样是不对的。框架是不断更新的,而我们所学习的底层是不变的。不能完全将重点放在上层技术上。如果说框架是我们学习是的定理,那么java虚拟机就是公式的推导过程,他才是公式出来的关键。
二、java和c++在内存回收上区别
java的独特机制就是内存自动回收机制 ,而c++中内存是需要开发人员自行处理的。在此列出java和c++中的不同,和对应的特点。
java | c++ | |
回收机制 | 自动处理垃圾 | 开发人员管理垃圾 |
优点 | 开发人员不需将大量精力放在垃圾回收上,可以大大提高开发效率。垃圾回收机制可以帮 | 可以让开发人自行管理内存,如果开发人员本身能力较强可以有很好的垃圾处理方案 |
缺点 | 会导致开发人员忽视内存处理问题,垃圾收集不是万能的。如果不懂得底层原理,会在项目中出现很大的问题 | 如果开发人员技术较弱,就会导致内存很乱 |
表1
三、jvm的广泛应用
jvm(java 虚拟机),虽然叫做java虚拟机,但是不仅仅能解释java代码,只要符合jvm的字节码规范要求,无论什么语言都可以运行。由于这一点的存在,我们的java代码便是跨平台的语言,因为最终都需要转换为字节码(java代码需要转成字节码文件在传给jvm,我们平时编码产生的out文件夹里面的就是字节码文件,如图2),java可以和很多遇见进行交互等,各自只需要满足自己代码编写的规范,所生成的字节码,都是符合jvm规范的,便可以交互。
图2
四、 JVM的整体结构
我们平时使用尝使用的虚拟机为HotSpot VM,平时安装的jdk对应的就是HotSpot VM。图3所示
图3
展示一下自己画的内存结构图,如图4所示,其中方法区和堆为多线程共享,而虚拟机栈、本地方法区、程序计数器为单线程独享。
图4
后续的更新会根据该结构图进行具体的更新。