深入理解JVM(一):什么是JVM?什么是JVM内存模型?


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