作者回复: 回答很全面,赞!
作者回复: 对的。合理设置堆内存大小,根据实际业务调整,不宜过大,也不宜过小。
作者回复: 也不是越大越好,因为新生代过大,会导致minor gc的停顿时间过长。
我们知道,如果新生代很快就满了,会以担保的方式将新增的对象直接分配到老年代,这样增加了老年代回收的成本,这个成本跟具体的垃圾收集器相关。所以我们需要适当的调大年轻代,将对象尽量留在年轻代回收。
如果调整太大,我们知道每次Minor GC分为对象标记和复制两个阶段,并且都是STW的,如果对象过于庞大,有可能标记时间要大于复制时间,这样反而适得其反。
作者回复: 你好,某一时间段高峰值的访问可能会有这种情况,JVM会最大可能进行对象的回收,防止内存溢出异常的发生。如果不是内存泄漏,或者瞬时并发量大大超过预期并发量的情况,几乎很少发生内存溢出异常。
建议结合内存持续占用率以及Full GC发生的频率来分析调优。
作者回复: 线上正常情况下FullGC出现的频率是非常低的,几天一次,一般FullGC如果出现一天超过一次,就已经算频繁了。
做性能压测的时候,FullGC的频率会高一些,但也是仅限于个位数。
作者回复: 优化传输性能,例如使用特定的数据结构序列化与反序列化传输数据(protobuff序列化),并且提高单台服务并行处理能力。
作者回复: 在jmap -heap pid运行之后,有一个MaxHeapSize,这个就是1953M,还有一个是NewSize以及OldSize,加起来就是初始化的124M大小。
作者回复: 使用AB工具运行后会自动打印出这些信息,回顾下加餐篇《加餐 | 推荐几款常用的性能测试工具》
作者回复: 如果内存一直没有释放,我想跟内存设置比例没有关系,可能是引用没有释放,尝试在传完之后手动释放内存试试
作者回复: java -X可以查看部分JVM参数信息
作者回复: 需要根据自己的项目来具体做配置,如果不清除具体需要的配置大小,使用默认配置就可以了
作者回复: 打开分配担保机制,是为了避免Full GC过于频繁。
作者回复: 是一种简单的压力测试工具,可以网上查询下资料
作者回复: 嗯,在后面的答疑课堂中讲到了,有问题欢迎提出