▷ 谈及内存结构各个部分的数据交互过程:还可以再谈及生命周期、数据共享;是否GC、是否OOM
答:jvm 内存结构包括程序计数器、虚拟机栈、本地方法栈、堆、方法区;它是字节码运行时的数据区,针对字节码,就会有一个具体的分配。
- 对于
类信息本身
,需要把它存储在方法区;- 针对字节码对应的
类要执行
的时候,相应的还需要new 对象
,就需要在堆空间 new 对象;- 对应的执行过程中,都是一些
方法的调用
,需要在虚拟机栈分配栈帧,代表一个一个的方法的调用。- 在整个过程中需要用到程序计数器,来记录虚拟机栈的对应的每个
线程执行到哪一行
了。■ 对应jvm内存结构各部分的生命周期,堆、方法区是和 jvm生命周期一致的;而 pc寄存器、栈、本地方法栈是和线程生命周期一致的。所以,这个堆、方法区,数据可以共享;而pc寄存器、栈、本地方法栈是线程私有的,不共享;
■ 其中堆、方法区 会GC、OOM;而pc寄存器不GC,不OOM;栈、本地方法栈不会GC,会OOM;
答:类加载包括三个阶段:加载、链接、初始化,其中链接还包括了验证、准备、解析。
加载阶段:首先通过类全限定名获取到类的二进制字节流,然后将字节流对应的静态存储结构转化成方法区运行时的数据结构;接着在内存生成一个Class对象;
链接阶段:验证,保证了虚拟机的安全;准备,为类变量分配内存并设置默认初始值;解析,将常量池的符号引用转化成直接引用。
初始化阶段:目的是执行类变量、静态代码块。
答:官方是将类加载器分为两种:引导类加载器、自定义类加载器;详细划分的话,包括:引导类加载器、扩展类加载器、应用程序类加载器、用户自定义类加载器。
除了引导类加载器,其他类加载器都直接或或间接继承 ClassLoader;这个引导类加载器是用C或C++语言写的,用来加载Java的核心库(java、javax、sun包);
继承关系是启动类是根父类,扩展类继承它,然后应用程序类继承扩展类加载器,用户自定义的类加载器继承应用程序类加载器。
答:jvm 对 class 文件是按需加载,需要使用到该类才会把该类的class文件加载到内存生成Class对象。加载类的class文件就是使用双亲委派模式,即把请求交给父类处理。它是一种任务委派模式。
■ 引用计数算法
■ 可达性分析算法
思路:以根对象集合**(GC Roots) 为起始点**,搜索连接的目标对象是否可达,不可达,标记为垃圾对象。
这个搜索过程走过的路径称为引用链。
GC Roots可以是哪些? ▷各种引用对象(栈引用对象、本地方法栈引用对象、方法区静态属性引用对象、字符串常量池引用对象)
■ 标记-清除算法:
标记的是可达对象,不是垃圾对象
】优缺点:
- 优点:基础、常见
- 缺点:效率不高;产生内存碎片;GC时,需要停止整个应用程序(STW),用户体验差。
■ 复制算法:
优缺点:
- 优点:没有标记和清除过程,实现简单,运行高效; 复制过去以后保证空间的连续性,不会出现“碎片”问题。
- 缺点:需要两倍的内存空间。
■ 标记-压缩(整理)算法:
优缺点:
- 优点:消除了标记-清除算法当中,内存区域分散的缺点,消除了复制算法当中,内存减半的高额代价。
- 缺点:从效率上来说,标记-整理算法要低于复制算法。 移动对象的同时,如果对象被其他对象引用,则还需要调整引用的地址
Hotspot VM的GC分为两大种类型:一种是部分收集(Partial GC),一种是整堆收集(FullGC)
部分收集:不是完整收集整个Java堆的垃圾收集。其中又分为:
- 新生代收集(MinorGC/YoungGC):只是新生代的垃圾收集
老年代收集(MajorGC/o1dGC):只是老年代的圾收集。
- 混合收集(MixedGC):收集整个新生代以及部分老年代的垃圾收集。
整堆收集(FullGC):收集整个java堆和方法区的垃圾收集。
如果本文对你有帮助的话记得给一乐点个赞哦,感谢!