如何合理估算主机配置需求( 六 )


它是基于动态内存布局,(暂时)不设年龄分代,使用了读屏障、染色指针和内存多重映射等技术来实现可并发的标记-整理算法的收集器 。
在 JDK 11 新加入,还在实验阶段,
主要特点是:回收TB级内存(最大4T),停顿时间不超过10ms 。
优点:低停顿,高吞吐量,ZGC 收集过程中额外耗费的内存小
缺点:浮动垃圾
目前使用的非常少,真正普及还是需要写时间的 。
如何选择垃圾收集器?
在真实场景中应该如何去选择呢,下面给出几种建议,希望对你有帮助:
1、如果你的堆大小不是很大(比如 100MB ),选择串行收集器一般是效率最高的 。参数:-XX:+。
2、如果你的应用运行在单核的机器上,或者你的虚拟机核数只有 单核,选择串行收集器依然是合适的,这时候启用一些并行收集器没有任何收益 。参数:-XX:+。
3、如果你的应用是“吞吐量”优先的,并且对较长时间的停顿没有什么特别的要求 。选择并行收集器是比较好的 。参数:-XX:+。
4、如果你的应用对响应时间要求较高,想要较少的停顿 。甚至 1 秒的停顿都会引起大量的请求失败,那么选择 G1 、 ZGC 、 CMS 都是合理的 。虽然这些收集器的 GC 停顿通常都比较短,但它需要一些额外的资源去处理这些工作,通常吞吐量会低一些 。参数:-XX:+ 、 -XX:+ 、 -XX:+ 等 。从上面这些出发点来看,我们平常的 Web 服务器,都是对响应性要求非常高的 。
选择性其实就集中在 CMS、G1、ZGC 上 。而对于某些定时任务,使用并行收集器,是一个比较好的选择 。
为什么使用元空间替换了永久代?
什么是元空间?什么是永久代?为什么用元空间代替永久代?
我们先回顾一下方法区吧,看看虚拟机运行时数据内存图,如下:
方法区和堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译后的代码等数据 。
什么是永久代?它和方法区有什么关系呢?
如果在虚拟机上开发、部署,很多程序员都把方法区称作永久代 。
可以说方法区是规范,永久代是针对该规范进行的实现 。
在Java7及以前的版本,方法区都是永久代实现的 。
什么是元空间?它和方法区有什么关系呢?
对于Java8,取消了永久代,取而代之的是元空间() 。
换句话说,就是方法区还是在的,只是实现变了,从永久代变为元空间了 。
为什么使用元空间替换了永久代?
永久代的方法区,和堆使用的物理内存是连续的 。
永久代是通过以下这两个参数配置大小的~
对于永久代,如果动态生成很多class的话,就很可能出现java.lang.: space错误,因为永久代空间配置有限嘛 。最典型的场景是,在web开发比较多jsp页面的时候 。
JDK8之后,方法区存在于元空间() 。
物理内存不再与堆连续,而是直接存在于本地内存中,理论上机器内存有多大,元空间就有多大 。
可以通过以下的参数来设置元空间的大小:
所以,为什么使用元空间替换永久代?
表面上看是为了避免OOM异常 。
因为通常使用和设置永久代的大小就决定了永久代的上限,但是不是总能知道应该设置为多大合适, 如果使用默认值很容易遇到OOM错误 。
当使用元空间时,可以加载多少类的元数据就不再由控制, 而由系统的实际可用空间来控制啦 。
什么是Stop The World ? 什么是?什么是安全点?
进行垃圾回收的过程中,会涉及对象的移动 。
为了保证对象引用更新的正确性,必须暂停所有的用户线程,像这样的停顿,虚拟机设计者形象描述为Stop The World 。也简称为STW 。