JVM是java中底层的知识,这里的内容比较复杂,对于一些软件编程,会经常使用,但很多业务其实碰不到这里的知识,下图为目录
JVM,java虚拟机,它的前身是99年的hotspot java虚拟机,之后被oracle收购后,形成了现在的OpenJDK使用的主流JVM
一些商业公司都有自己的定制版本,比如阿里有AJDK
之前讲01是最底层的信号,而再向上就是机器码,不同的操作系统,硬件都会对应不同种类的机器码,这就需要针对多种平台编写不同代码,而jvm可以做到在不同平台都字节码来运行,字节码bytecode大小为一个字节(8位),可以存储256种不同的指令,java有200个左右的指令
字节码需要通过类加载过程加载到JVM环境后,才可以执行
执行方法有三种:
解释执行
JIT编译执行
JIT与解释执行混合(主流JVM默认执行方式)
任何程序都需要加载到内存才能与CPU进行交流,字节码.class文件同样需要加载到内存中,才可以实例化类
上图即为经典JVM布局
从Object ref = new Object()分析,查看字节码如下
垃圾回收,简称GC,判断内存不足且虚拟机空闲时,就会清除不再使用的对象,自动释放内存
G1采用标记清除,可以配置-XX :+UseCMSCompactAtFul!Collection参数,强制full gc后对老年代进行压缩,也就是空间碎片整理,可以配置XX : +CMSFul!GCsBeforeCompaction=n 参数,防止频繁整理引发STW(暂停整个应用程序执行)