jvm

jvm基础:

https://www.cnblogs.com/clamp7724/p/11750764.html

调优这方面- -其实除了架构师基本用不到,知道基本原理和简单的调优就可以了。。。

调优一般是调优 方法区 和 堆

方法区: 存放方法的信息(变量,常量,类信息,运行时常量池等)

堆(GC发生在这里): 存放对象实例

1.堆

1.1 新生代区

1.1.1 伊甸区 (西方神话人类起源地-。-)

1.1.2 survivor from (幸存者from区)

1.1.3 survivor to (幸存者to区)

1.2 老年代区

内存比例:

新生代:老年代 = 1 : 2

伊甸区:survivor from :survivor to = 8:1:1  

GC机制: (survivor from 和 survivor to 直接写成from 和 to)

1. 一个对象实例A被声明后进入堆的新生代伊甸区

2. 根据GC策略(比如GC发现没有指向A的变量了,或者伊甸区满了等),A进入from区

3. from满了以后,触发Miner GC(轻GC),把from区的一部分幸存者数据放到 to区,2区互换(A还是在from区,只不过是之前的to区),清的to区(之前的老from区,没被复制到to区的都被清空了= =)。新来的开始进入新from区。

4. 新from区满了以后,重复以上步骤,15次(jvm默认次数)后, A还活着的话就会进入老年区。

6.当老年代区也满了以后,会产生full GC, jvm会停掉所有线程(STW: stop the world),开始全面清理垃圾。

如果A的占用空间非常大,为了防止过度频繁的轻GC(幸存者区会很快满。。。),会直接把A放到老年区。

GC的调优主要就是改变这几个区域的空间大小比例,还有垃圾回收算法(GC策略),减少full GC

垃圾回收算法:

1. 标记清除算法:

把可回收的部分标记为清除(逻辑清除),假装不存在了,以后需要空间可以直接覆盖。

缺点: 幸存者的内存地址不连续,会有很多碎片。可能会导致大对象存不进来直接GC

2. 复制算法:(survivor from 和 to 的常用算法就是这个)

只用内存的1/2,1区和2区,每次内存回收的时候,1区把不需要清除的复制到2区,此时对象在2区内存地址连续,没有碎片,然后清空1区,把2区作为新的1区。

缺点:少了一半可用空间。

3. 标记整理算法:

先把幸存对象和可回收的对象标记,然后把可回收的清除,重新整理排序。

缺点:开销大,花费时间长。 

4.分代收集算法:(现在大部分都用的这个)

不同区域不同算法。

新生代中大量对象死去(局部变量这类的),所以用复制算法。

老年代中的对象都是在幸存者区域中经过了15次的GC回收的老不死- -所以高概率长久存活,因此用标记整理或者标记清除算法。

原文地址:https://www.cnblogs.com/clamp7724/p/11828988.html