01 前言
本次将对jvm有更深入的学习,我们不仅要让程序能跑起来,而且是可以跑得更快!可以分析解决在生产环境中所遇到的各种“棘手”的问题,比如运行的应用卡住了,日志不输出,程序没有反应,CPU负载突然升高,多线程应用下,如何分配线程数量等。
02 JVM介绍
2.1 什么是JVM?
作为java工程师,对于jvm肯定不陌生。JVM是Java Virtual Machine的缩写,通俗来说也就是运行java代码的容器。当项目启动时,会根据jvm相关配置参数,在计算机的内存中开启一片空间用于运行JVM。之后java相关代码就会被加载进JVM中运行。
百度百科对JVM的定义:
2.2 为什么要了解JVM?
对于Java程序员来说,在虚拟机自动内存管理机制的帮助下,不再需要为每一个new操作去写配对的delete/free代码,不容易出现内存泄漏和内存溢出问题,看起来由虚拟机管理内存一切都很美好。不过,也正是因为Java程序员把控制内存的权力交给了Java虚拟机,一旦出现内存泄漏和溢出方面的问题,如果不了解虚拟机是怎样使用内存的,那排查错误、修正问题将会成为一项异常艰难的工作。
03 JVM内存模型
3.1 JVM整体架构
由上面的图可以看出,JVM虚拟机中主要是由三部分构成,分别是类加载子系统、运行时数据区、执行引擎。
类加载子系统
Java虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型。
运行时数据区
Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而一直存在,有些区域则是依赖用户线程的启动和结束而建立和销毁。
执行引擎
执行引擎用于执行JVM字节码指令,主要有两种方式,分别是解释执行和编译执行,区别在于,解释执行是在执行时翻译成虚拟机指令执行,而编译执行是在执行之前先进行编译再执行。解释执行启动快,执行效率低。编译执行,启动慢&