1.简述Java语言中的JVM虚拟机的内存模型?
在整个的JVM的结构分为类加载机制,数据内存区,执行引擎在JVM的内存模型中共分为五个部分:程序计数器,虚拟机栈,本地方法栈,java堆,方法区,在以上的5个数据区中

Java堆,方法区:线程共享
程序计数器,虚拟机栈,本地方法栈:线程私有
程序计数器:在JVM内部是一块很小的内存区域,用来指示当前程序中线程所执行的字节码的行数指示器,为了保证线程进行上下文切换时能恢复到正确的位置,每一个线程有独立的程序计数器,故为线程私有,且不会出现内存溢出。

虚拟机栈:其生命周期线程相同,因此同样为线程私有,每个方法被执行的时候都会创建一个栈帧用于存储局部变量表,操作栈,动态链接,方法出口等信息。每一个方法被调用的过程就对应一个栈帧在虚拟机栈中从入栈到出栈的过程。

本地方法栈:其与虚拟机栈发挥的作用相似,区别是虚拟机栈执行的是Java方法字节码,而本地方法栈则为虚拟机使用到的native方法服务,可能底层调用的c或者c++,我们打开jdk安装目录可以看到也有很多用c编写的文件,可能就是native方法所调用的c代码。

Java堆:Java堆是JVM内存中最大的一部分,被所有的线程进行共享,所有的对象实例以及数组都要在堆上分配。垃圾回收器主要管理的对象。而年轻代内存又被分成三部分,Eden空间、From Survivor空间、To Survivor空间,默认情况下年轻代按照8:1:1的比例来分配;
年轻代存储“新生对象”,我们新创建的对象存储在年轻代中。当年轻内存占满后,会触发Minor GC,清理年轻代内存空间。
老年代存储长期存活的对象和大对象。年轻代中存储的对象,经过多次GC后仍然存活的对象会移动到老年代中进行存储。老年代空间占满后,会触发Full GC。

方法区:存储类信息、常量、静态变量等数据,是线程共享的区域,为与Java堆区分,方法区还有一个别名Non-Heap(非堆);栈又分为java虚拟机栈和本地方法栈主要用于方法的执行。

2.JVM虚拟机中判断对象存活的方法
(1)引用计数算法
简单来说就是给对象添加一个引用计数器,每当对象被引用一次就加1,引用失效时就减1。当为0的时候就判断对象不会再被引用。
优点:实现简单效率高,被广泛使用与如python何游戏脚本语言上。
缺点:难以解决循环引用的问题,就是假如两个对象互相引用已经不会再被其它其它引用,导致一直不会为0就无法进行回收。
(2)可达性分析算法
可达性分析算法判断对象是否存活。这个算法有效解决了循环利用的弊端。
它的基本思路是通过一个称为“GC Roots”的对象为起始点,搜索所经过的路径称为引用链,当一个对象到GC Roots没有任何引用跟它连接则证明对象是不可用的。

3.JVM中的垃圾回收算法
(1)标记/清除算法【最基础】
(2)复制算法
(3)标记/整理算法
Jvm采用分代收集法对不同区域采用不同的回收算法。