Minor GC的触发条件:
- 当Eden区满时触发。
Full GC的触发条件:
- 调用System.gc时,系统会建议执行Full GC,但是不一定执行。
- 老年代空间不足时触发。
- 方法区(永久代/元空间)空间不足时触发。
- 通过Minor GC后进入老年代的平均大小大于老年代的可用连续内存时触发。
- 由Eden区、From Space区向To Space区复制时,对象大小大于To Space可用内存,则把该对象转存到老年代,且老年代的可用连续内存小于该对象大小时触发。
分代收集算法的执行流程
- 新建的对象优先分配在Eden区;
- 当Eden区满了,就会触发Minor GC,Eden中的存活对象被移动到Survivor0,Eden被清空;
- 等Eden区再满了,再次触发Minor GC,Eden和Survivor0中的存活对象又会被复制到Survivor1,S0和Eden被清空,然后下一轮S0与S1交换角色,如此循环往复。
- 当两个Survivor区切换了几次(HotSpot虚拟机默认15次)之后,仍然存活的对象,将被复制到老年代
说一下 jvm 的主要组成部分?及其作用?
-
类加载器(ClassLoader)
-
运行时数据区(Runtime Data Area)
-
执行引擎(Execution Engine)
-
本地库接口(Native Interface)
组件的作用: 首先通过类加载器(ClassLoader)会把 Java 代码转换成字节码,运行时数据区(Runtime Data Area)再把字节码加载到内存中,而字节码文件只是 JVM 的一套指令集规范,并不能直接交个底层操作系统去执行,因此需要特定的命令解析器执行引擎(Execution Engine),将字节码翻译成底层系统指令,再交由 CPU 去执行,而这个过程中需要调用其他语言的本地库接口(Native Interface)来实现整个程序的功能。
在Java语言里,可作为GC Roots对象的包括如下几种:
- 虚拟机栈(栈桢中的本地变量表)中的引用的对象
- 方法区中的类静态属性引用的对象
- 方法区中的常量引用的对象
- 本地方法栈中JNI的引用的对象
-Xmx3550m:设置JVM最大堆内存为3550M。
-Xms3550m:设置JVM初始堆内存为3550M
2.JVM垃圾回收算法
答:三种算法。https://www.cnblogs.com/cxiaocai/p/11547743.html
复制算法,由一个内存块复制到一个内存块下,缺点是有一半的内存是留给复制用的,不用用于直接存储
标记清理,扫逐个内存块是否可被回收,可以回收的就回收掉,缺点是会产生内存碎片
标记整理,标记整理是是标记清除的升级版,优点:解决内存碎片问题。缺点:整理阶段,由于移动了可用对象,需要去更新引用。