一、JVM 体系结构与工作方式
看了JVM 体系结构与工作方式, 一直觉得很像个单片机,只不过有很多特别的地方,当然最大的特别在于一个是硬件,一个软件,所以JVM在实现上更为灵活。
由下面4部分组成:
1.类加载器 --- ClassLoader 加载进来的.class文件放在堆中 ,需要分配内存
2.执行引擎 --- 一个执行引擎对应一个实例线程在栈中 ,需要分配内存
3.内存区 --- 一个模拟实际机器上的寄存器,PC指针 , 需要分配内存
4.本地方法区 --- 调用C/C++ ,需要分配内存
执行引擎工作过程:
这个栈中有指令集,PC寄存器,局部变量区,操作栈 ,具体执行过程和单片机没有什么两样。
二、内存管理
主要分为栈和堆,静态分配和动态分配(栈内存分配, 堆内存分配)
栈:有PC寄存器,多个栈帧。存储局部变量,对应着一个线程序, 不用关心数据一致性和同步锁的问题
堆:有方法区,本地方法区,运行时常量池。存储对象,线程共享区,需要注意同步,一致性问题 ,还存放.class加载进来时的各种信息。
三、内存回收策略
静态内存:在编译时就确定的内存。局部变理包括原生数据类型和对象的引用都是静态分配的,当程序执行结束就回收,这些内存空间是在栈上分配的,所以这个方法结束,栈没了,这些内存也就释放了。
动态内存回收:垃圾收集器
只要是某个对象不再被其他活动对象引用,那么这个对象就可以被回收了。
基于分代的垃圾收集算法(hotspot):
思路:分为年轻代和老年代,新生成的对象被分在老年代,如果对象经过几次回收后仍然存在,那么就会被分到老年代, 老年代扫描不频繁,以提高效率。
Young区:Eden Survivor(from | to) 始终保持Survivor中一个是空的
Old区:这里满了之后就会触发GC
Perm区:主要放的是Class对象
最后:JVM 作用在于跨平台, 一处编译到处运行是和其他语言的一个很大的不同。