JVM理解笔记
JVM理解笔记
Java虚拟机,让Java实现跨平台的机制。专门编译Java代码
组成:
类加载器(ClassLoader)
运行时数据区(Runtime Data Area)
执行引擎(Execution Engine)
本地库接口(Native Interface)
作用:
通过类加载器(ClassLoader)会把 Java 代码转换成字节码,运行时数据区(Runtime Data Area)再把字节码加载到内存中,而字节码文件只是 JVM 的一套指令集规范,并不能直接交个底层操作系统去执行,因此需要特定的命令解析器执行引擎(Execution Engine),将字节码翻译成底层系统指令,再交由 CPU 去执行,而这个过程中需要调用其他语言的本地库接口(Native Interface)来实现整个程序的功能。
jvm 运行时数据区
程序计数器
虚拟机栈
本地方法栈
堆
方法区
有的区域随着虚拟机进程的启动而存在,有的区域则依赖用户进程的启动和结束而创建和销毁。
内存管理
(1)对于Java运行时涉及到的存储区域主要包括程序计数器、Java虚拟机栈、本地方法栈、java堆、方法区以及直接内存等等。对于每个部分,都有其使用的条件。程序计数器主要是取下一条指令,在Java里面主要是取下一条指令的字节码文件;Java虚拟机栈主要是利用栈先进后出的特性存储局部变量表,动态链接等,主要包括堆内存和栈内存,对于程序员内存分析而言是特别重要的。本地方法栈与上边的栈基本作用差不多,只不过这里是为Java方法而服务。Java堆是内存管理中最大的一块,所有的线程共享这一块内容,同时该部分也是垃圾收集器的主要区域。
(2)虚拟机的垃圾回收机制是完善的,动态内存分配和回收是比较成熟的,在内存管理机制中,大部分都不需要我们考虑内存回收,只有Java堆和方法区需要我们考虑处理内存问题。一般的对于内存回收首先就是判断某一个部分是生存还是死亡,主要是通过下面二种算法:
其一是引用计数算法,本算法实现简单,判定的效率也是比较高的,很多的软件都使用了该算法,但是主流的Java并没有选择该算法,核心的问题是该算法难以处理对象之间相互调用的问题。
其二是称可达性分析算法,该算法核心思想是依靠判断对象是否存活来实现的,本算法是通过一系列的GC ROOTS的对象作为起始点,采用搜索的算法遍历引用链,如果搜索过程中没有发现该节点,则认为该节点是不可达的,即可回收的,在Java里面,一般可以使用该算法处理问题。
特性
1、移植性
无论是GC还是Hotspot都可以用在任何Java可用的地方。比方说,JRuby可以运行在其他平台上,Rails应用就可以运行在IBM主机上的JRuby上,而且这台IBM主机运行的是CP/CMS.实际上,由于Java和OpenJDK项目的开源,我们正在看到越来越多的平台的衍生,因此JVM的移植性也将越来越棒。
2、成熟
JVM已有多年的历史,在过去的这些年里,许多开发者为它做出了许多贡献,使得它的性能一次又一次地提升,让JVM变得更加稳定、快速和广泛。
3、覆盖面
JRuby和JVM上的其他语言项目已经被承认,一个例子是invokedynamic specification(akaJSR292)。JSR越来越配合新的语言,JVM已不再是Java一个人定制规则。JVM正在构建成为类如JRuby等项目的优良平台。还有一个MLVM(multiple languageVM)项目,好比是新特性的清算机构,是一个许多企业应用的开发者试图添加应用的地方,而这些应用正是他们想在JVM中看到的。而且JVM开发者互相协作、彼此影响,无疑这有利于JVM新特性的诞生。这些细节都可以看到JVM正在关注开发者的需求,扩大他的覆盖面。
本文地址:https://blog.csdn.net/weixin_45961595/article/details/109272335