jvm
作者:互联网
JVM虚拟机
-
JVM的位置
-
JVM的体系结构
-
类加载器
-
虚拟机自带的加载器
-
启动类(根)加载器
-
扩展类加载器
-
应用(系统类)程序加载器
-
-
Native
//native:凡是带了native关键字的,说明java的作用范围达不到,会去调用底层c语言的库 //会进入本地方法栈 //调用本地方法本地接口 JNI接口 //JNI:扩展java 的使用,融合不同的编程语言为java使用,最初是:c c++ //java诞生的时候c,c++横行,想要立足,必须要有调用c c++的程序 //它在内存区域中专门开辟了一块标记区域:native method stack //在最终执行的时候,加载本地方法库中的方法通过JNI接口 //调用其他接口:
-
方法区
- 静态变量、常量、类信息(构造方法,接口定义)、运行时的常量池存在方法区中,但是实例遍历存在堆内存中和方法区无关(static、final、class、常量池)
-
栈:数据结构
-
程序= 数据结构+算法
-
先进后出,后进先出
-
队列:先进先出(FIFO:First Input First Output)
-
main()先执行,最后结束
-
栈内存,主管程序的运行,生命周期和线程同步。线程结束,栈内存也就是释放,对于栈来说,不存在垃圾回收问题。一旦线程结束,栈就over
-
存储8大基本类型 + 对象引用 + 实例的方法
-
栈满了:抛出stackoverflowerror
-
-
堆
Heap:一个JVM只有一个堆内存,堆内存的大小是可以调节的
类加载器读取类文件后。会把:常量、类、方法、变量,保存所有引用类型的真实数据
堆内存分为三个区:
- 新生区(伊甸园区) Young
- 类:诞生和成长的地方,或者死亡
- 所有的对象都是在伊甸园区new出来的
- 幸存者(0、1)
- 养老区 Old :当一个对象经历了15次GC后,就会进入养老区
- 永久区
GC 垃圾回收,主要是在伊甸园区和养老区
OOM:堆内存不够 outofmemory
JDK8以后:养老区 = 元空间
99%的对象都是临时对象
- 新生区(伊甸园区) Young
-
永久区
- 这个区域常驻内存,用来存放JDK的Class对象,interface元数据,存储的是Java运行时的环境或类信息,不存在垃圾回收,关闭JVM就会释放
-
GC常用算法
-
引用算法
-
复制算法
谁空谁是to
- 好处:没有内存的碎片
- 坏处:浪费了内存空间,对一般空间永远是空to区,假设对象100%存活
- 复制算法最佳使用场景:对象存活度比较低的时候-->新生区
-
标记清除算法
-
优点:不需要额外的空间
-
缺点:两次扫描,严重浪费时间,会产生内存碎片
-
-
标记压缩算法
-
标记清除压缩算法
先标记几次
再压缩
-
总结
- 内存效率:复制算法>标记清除算法>标记压缩算法>(时间复杂度)
- 内存整齐度:复制算法= 标记压缩算法>标记清除算法
- 内存利用率:标记压缩算法 = 标记清除算法 >复制算法
标签:JVM,标记,算法,内存,jvm,压缩算法,加载 来源: https://www.cnblogs.com/lobort/p/16265176.html