JVM

 

 

 

 

 

 

 

 

 

Minor GC的触发条件:
  • 当Eden区满时触发。
Full GC的触发条件:
  • 调用System.gc时,系统会建议执行Full GC,但是不一定执行。
  • 老年代空间不足时触发。
  • 方法区(永久代/元空间)空间不足时触发。
  • 通过Minor GC后进入老年代的平均大小大于老年代的可用连续内存时触发。
  • 由Eden区、From Space区向To Space区复制时,对象大小大于To Space可用内存,则把该对象转存到老年代,且老年代的可用连续内存小于该对象大小时触发。

分代收集算法的执行流程

  1. 新建的对象优先分配在Eden区;
  2. 当Eden区满了,就会触发Minor GC,Eden中的存活对象被移动到Survivor0,Eden被清空;
  3. 等Eden区再满了,再次触发Minor GC,Eden和Survivor0中的存活对象又会被复制到Survivor1,S0和Eden被清空,然后下一轮S0与S1交换角色,如此循环往复。
  4. 当两个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

  复制算法,由一个内存块复制到一个内存块下,缺点是有一半的内存是留给复制用的,不用用于直接存储

  标记清理,扫逐个内存块是否可被回收,可以回收的就回收掉,缺点是会产生内存碎片

  标记整理,标记整理是是标记清除的升级版,优点:解决内存碎片问题。缺点:整理阶段,由于移动了可用对象,需要去更新引用。

 

posted @ 2019-07-26 16:14  小蚊子大人KN  阅读(175)  评论(0编辑  收藏  举报