JVM学习笔记

1、JVM虚拟机将内存数据分为:程序计数器、虚拟机栈、本地方法栈、Java堆和方法区等部分。

  • 程序计数器:用于存放下一条运行的指令;各线程私有
  • 虚拟机栈和本地方法栈用于存放函数调用堆栈信息;虚拟机栈为线程私有,
  • JAVA堆用于存放JAVA程序运行时所需的对象等数据
  • 方法区用于存放程序的类元数据信息。

2、虚拟机栈,通过栈帧保存上下文数据,在栈帧中与性能调优最为密切相关的是局部变量表。局部变量表用于存放方法的参数和方法的内部局部变量。虚拟机栈用来管理Java函数的调用

3、本地方法栈,用于管理本地方法的调用。本地方法不是用java实现的,而是用C实现的。和虚拟机栈一样都会抛出StackOverflowError和OutOfMemoryError。

4、Java堆,几乎所有的对象和数组都是在队中分配内存的。Java堆分为新生代和老年代两个部分。

新生代分为eden,s0(from space),s1(to space),老年代为tenured

5、方法区,与堆空间类似,JVM中所有的线程共享。主要保存类的元数据(类型信息、常量池、域信息、方法信息)。方法区也可以成为永久区,主要存放常量和类的定义信息。

6、JVM内存分配参数

  • -Xmx 最大堆内存,指新生代和老年代大小之和的最大值,是Java应用程序的堆上限。
  • -Xms 最小堆内存,即JVM启动时候占用的操作系统内存大小。
  • -Xmn 设置新生代大小。一般设置为整个堆内存的1/4至1/3左右。
  • -XX:NewSize 用于设置新生代的初始化大小,-XX:MaxNewSize用于设置新生代的最大值。 通常只需设置-Xmn即可,设置-Xmn的效果等同于设置了同样大小的-XX:NewSize和-XX:MaxNewSize。若两者设置不同,则可能会导致内存震荡。
  • -XX:MaxPermSize 设置持久代最大值,-XX:PermSize 设置持久代初始化大小。持久代的大小直接决定了系统可以支持多少个类定义和多少常量。一般情况64MB的持久代即可满足需求,超过128MB,则需要对系统进行优化。
  • -Xss 设置线程栈大小。如果系统需要大量线程并发执行,那么设置一个较小的堆和较小的栈,有助于提高系统所能承受的最大线程数。
  • -XX:SurvivorRatio 用来设置新生代中eden和s0空间的比例关系,s0和s1空间大小相同,职能一样,并在Minor GC后,会互换角色。
  • -XX:NewRatio=老年代/新生代,用来设置老年代和新生代的比列关系
  • -XX:+PrintGCDetails 打印堆的实际大小。
  • -XX:MinHeapFreeRatio,设置堆空间最小空闲比列。当堆空间的空闲内存大小小于这个数值时,JVM便会压缩空间,得到一个较小的堆。
  • -XX:TargetSurvivorRatio,设置survivior区的可使用率。当survivior区的空间使用率达到这个数值时,会将对象送入老年代。

7、垃圾回收算法与思想

  • 引用计数法,引用加1,引用失效减1。由于无法处理循环引用的问题,引用计数法不适合用于JVM的垃圾回收。
  • 标记-清除算法(Mark-Sweep),现代垃圾回收算法的思想基础。将垃圾回收分为标记阶段和清除阶段。先通过根节点标记所有的可达对象,然后清除所有的不可达对象,完成垃圾回收。缺点是回收的空间是不连续的,不连续的内存空间的工作效率要低于连续的空间。
  • 复制算法(Copying) ,将原有的内存空间分为2块,每次只使用其中的一块,在垃圾回收时,将正在使用的内存中的存活对象复制到未使用的内存块中,之后清除正在使用的内存块中的所有对象,交换2个内存的角色,完成垃圾回收。在Java的新生代串行垃圾回收器中,使用了复制算法的思想。复制算法比较适用于新生代,因为在新生代,垃圾对象通常会多余存活对象,复制算法的效果会比较好。
  • 标记-压缩算法(Mark-Compact)适用于老年代的回收算法,在标记清除的基础上做了优化。从根节点开始,对所有可达对象做一次标记,然后将所有的存活对象压缩到内存的一端,之后清理边界外的所有空间,避免了碎片的产生,又不需要两块相同的内存空间,因此,性价比较高。
  • 增量算法,垃圾收集线程和应用线程交替进行,避免因垃圾回收时间过长而导致应用长时间挂起(Stop the World)。但是因为线程切换和上下文转换的消耗,会使得垃圾回收的总体成本上升,造成系统吞吐量的下降。
  • 分代算法。将内存区间根据对象的特点分成几块,根据每块内存区间的特点使用不同的回收算法,以提高垃圾回收的效率。新生代使用复制算法,老年代使用标记-压缩算法。

8、垃圾收集器的类型

  • 按线程数,分为串行垃圾回收器和并行垃圾回收器
  • 按工作模式,分为并发式垃圾回收器和独占式垃圾回收器
  • 按碎片处理方式,可分为压缩式垃圾回收器和非压缩式垃圾回收器
  • 按工作的内存区间,可分为新生代垃圾回收器和老年代垃圾回收器

9、评价GC策略指标

  • 吞吐量:应用程序的生命周期内,应用程序所花费的时间和系统总运行时间的比值,系统总运行时间=应用程序耗时+GC耗时。
  • 垃圾回收器负载:和吞吐量相反,GC的耗时和系统运行总时间的比值
  • 停顿时间:
  • 垃圾回收频率:一般来说,对于固定的应用而言,垃圾回收器的频率应该是越低越好。通常增大堆空间可以有效的降低垃圾回收发生的频率,但可能会增加回收产生的停顿时间。

 

你可能感兴趣的:(JVM)