虚拟机分为系统虚拟机(eg:VMWare)和程序虚拟机(eg:jvm)
jvm基本结构:
- 加载子系统:加载class信息,并将这些信息存放在方法区内
- 方法区:也叫永久区,存放类信息、常量信息、常量池、包括字符串字面量和数字常量等
- java堆:几乎所有的实例对象都是存放在java堆中,堆空间是所有线程共享的
- java栈:保存局部变量、方法参数、返回值、方法的调用,每个线程都有一个私有栈,线程被创建的时候就会被创建
- 直接内存:直接内存的读写优先于java堆,读写频繁的场合可能会考虑使用
- 本地方法栈:与java栈类似,最大不同本地方法栈用于本地方法调用
- PC寄存器:存放当前执行环境指针、程序计数器、下一步该执行哪个语句等等,执行本地方法时,其值为undefined
- 垃圾回收系统:不定时进行垃圾回收,采用的是复制算法
- 执行引擎:负责执行虚拟机的字节码,一般先编译成机器码后执
java堆细分:java堆内有细分为新生代和老年代,刚创建的时候都会在新生代的eden区内,到了足够长的时间就会从eden区进入s0区;GC每进行一次垃圾回收,元素的年龄就会+1,到了一定的年龄就会从新生代进入老年代;新生代又分为eden区、s0区和s1区(from区和to区);
复制算法:垃圾回收的时候先从s0中还有引用的元素复制到s1区,然后将s0清空,下一次垃圾回收就会把s1中还存在引用的元素复制到s0区,然后清空s1区。