我画了一个原型图 大家可以参考参考
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/d13fe142924f31ab60a50f317f465396.jpeg)
jvm是什么
JVM(Java虚拟机)是Java编程语言的运行环境,它的主要功能是将Java字节码文件(.class文件)解释或编译成可以在特定硬件和操作系统上执行的机器码。JVM允许Java程序在不同的平台上独立地运行,提供了跨平台、安全性和可移植性。
JVM负责管理内存、执行线程、进行垃圾回收等任务。
jvm的组成
所以说JVM主要负责执行字节码文件,执行线程,管理内存,垃圾回收等任务。
那一个java程序运行的是有进程 线程的概念的,先说线程,线程需要切换,线程需要存储变量,这些都是线程私有的。主要是程序计数器和虚拟机栈。还有字节码文件是用当方法区存储的。最大的空间就是堆存储区域,主要是存储变量和数组文件。还有一个最后的native方法。
前面说线程安全的时候有说过
程序计数器 存储的是线程执行的上下文 ,就是存储每次线程执行的状态,这样的话下一次程序
虚拟机栈 存储的是线程的局部变量,每个线程在运行时都会有一个对应的栈,用于存储方法的调用和局部变量。如 局部方法中的int i = 10; 中的 i 变量。
native方法区 存储的是native方法,调用c++的方法
堆 最大的存储区域,主要存储的是变量和数组
方法区存放的是运行时常量和类的元信息,比如字节码等
java代码执行的过程
·
双亲委派模型
如果一个类要加载,先从父类开始找实现,就是从BootstrapClassloader-》extClassLoader->AppClassloader 这样三个去找。
堆的组成
堆是java程序中占用最大的一部分,我们常把堆的组成分为老年代和新生代。新生代又分为eden,from,to三个区。这三个区默认的比例是8:1:1,
垃圾回收算法
主要有标记-清除算法,复制算法,标记-整理算法
标记-清除算法 从GC root标记一个对象,如果被引用的话就mark。然后执行回收操作。
优点:对于比较少垃圾对象的话适用
缺点是:GC时需要中断应用程序,然后遍历两边内存,一遍是mark,一遍是清除。然后是内存碎片比较多。
标记-整理 也叫做 标记-压缩算法
标记完对象以后,回收操作会进行内存整理。内存整理的话效率会更慢,内存碎片会少。
复制算法
就是将内存分为两部分,每次只使用一部分,标记完内存后移到另外一个区域。这个算法的优点是快,不需要中断应用程序,缺点是只能使用一部分,对于垃圾对象多的适用。
分代算法:
在jvm中,年轻代适合使用复制算法,老年代适合使用标记清除或标记压缩算法。因为年轻代的垃圾对象比较多,老年代更多的是稳定存在的对象。
CMS回收器 对于老年代的并发回收。
G1 回收器 jdk9的默认回收器
如何认定一个对象可以回收
可达数分析法 从GC root开始计算引用 如果没有引用了就算垃圾对象。
和 引用计数法。