• bro.
    2019-07-22
    堆外内存创建有两种方式:1.使用ByteBuffer.allocateDirect()得到一个DirectByteBuffer对象,初始化堆外内存大小,里面会创建Cleaner对象,绑定当前this.DirectByteBuffer的回收,通过put,get传递进去Byte数组,或者序列化对象,Cleaner对象实现一个虚引用(当内存被回收时,会受到一个系统通知)当Full GC的时候,如果DirectByteBuffer标记为垃圾被回收,则Cleaner会收到通知调用clean()方法,回收改堆外内存DirectByteBuffer

    作者回复: 回答很全面,赞!

    
     18
  • QQ怪
    2019-07-16
    盲目增大堆内存可能会让吞吐量不增反减,堆内存大了,每次gc扫描对象也就越多也越需要花费时间,反而会适得其反

    作者回复: 对的。合理设置堆内存大小,根据实际业务调整,不宜过大,也不宜过小。

    
     5
  • 迎风劲草
    2019-07-18
    老师,你的这个抢购场景下我理解是不是新生代越大越好,因为对象都是生命周期较短的对象。尽量在新生代中被回收掉。

    作者回复: 也不是越大越好,因为新生代过大,会导致minor gc的停顿时间过长。

    我们知道,如果新生代很快就满了,会以担保的方式将新增的对象直接分配到老年代,这样增加了老年代回收的成本,这个成本跟具体的垃圾收集器相关。所以我们需要适当的调大年轻代,将对象尽量留在年轻代回收。

    如果调整太大,我们知道每次Minor GC分为对象标记和复制两个阶段,并且都是STW的,如果对象过于庞大,有可能标记时间要大于复制时间,这样反而适得其反。

    
     3
  • 恰饭哒
    2019-07-16
    超哥好,我们经常发现生产环境内存使用超过90%持续3分钟,没有outofmer,
    dump下来堆没有发现问题,这种情况每不确定几小时就会一次,求解答

    作者回复: 你好,某一时间段高峰值的访问可能会有这种情况,JVM会最大可能进行对象的回收,防止内存溢出异常的发生。如果不是内存泄漏,或者瞬时并发量大大超过预期并发量的情况,几乎很少发生内存溢出异常。

    建议结合内存持续占用率以及Full GC发生的频率来分析调优。

     1
     2
  • 天天向上
    2020-01-04
    如果你在线上环境或性能测试时,发现频繁的 GC,且是正常的对象创建和回收,这个时候就需要考虑调整 JVM 内存分配了。。有个问题,这个频率多久算频繁呢?

    作者回复: 线上正常情况下FullGC出现的频率是非常低的,几天一次,一般FullGC如果出现一天超过一次,就已经算频繁了。

    做性能压测的时候,FullGC的频率会高一些,但也是仅限于个位数。

    
     1
  • godtrue
    2019-09-11
    课后思考及问题
    1:JVM 内存分配不合理最直接的表现就是频繁的 GC,这会导致上下文切换等性能问题,从而降低系统的吞吐量、增加系统的响应时间。
    频繁的GC,GC线程和应用线程会频繁的切入切出,所以,降低了系统的性能。
    2:老师好,现在有这么一个问题,我们有一个定时任务跑一次大概会有2亿条数据一条数据大概40kb大小,一次大概7.4TB多的数据,分布式任务50台机器需要刷新2个多小时,我们需要持久化,为了提高性能做了异步发送MQ到另外的机器来持久化,不过MQ积压严重,数据跑一次耗时太长,有什么建议的优化思路嘛?拆分消息会加剧业务处理的复杂度,目前我能想到的是加机器加带宽。请老师给个优化的思考?
    展开

    作者回复: 优化传输性能,例如使用特定的数据结构序列化与反序列化传输数据(protobuff序列化),并且提高单台服务并行处理能力。

    
     1
  • 千年不变,万年如一�...
    2020-02-09
    超哥,为什么 jmap -heap 出来的 Eden Space小于 From Space 和 To Space ?
    
    
  • Levvy
    2019-12-04
    最大堆内存1593M 还有124M 这俩数字是在哪看的,我怎么找不到

    作者回复: 在jmap -heap pid运行之后,有一个MaxHeapSize,这个就是1953M,还有一个是NewSize以及OldSize,加起来就是初始化的124M大小。

     1
    
  • 赤城
    2019-11-13
    根据老师的教程,在测试项目中,将年轻代的大小调整为3g,发现的确性能提升了,Mirror GC的次数也大大减少,但是Full GC的次数也明显多了几倍,这个是因为年轻代的空间过大,压缩了老年代的内存大小吗?
    java -jar -Xms4g -Xmx4g -Xmn3g heapTest-0.0.1-SNAPSHOT.jar
     1
    
  • 殷传宁
    2019-10-13
    吞吐量那个图是怎么查看的?方法能说一下吗?

    作者回复: 使用AB工具运行后会自动打印出这些信息,回顾下加餐篇《加餐 | 推荐几款常用的性能测试工具》

    
    
  • 没有小名的曲儿
    2019-09-30
    超哥好,我们线上的的服务器经常会进行图片处理,内存15G,堆内存设置的-Xms与-Xmx都是10G,经常在进行图片处理时,用top查看java进程,占用率高达79.1%。
    等传完之后,观察内存一直都是这么多。jmap也看了,是正常回收的。并且各个代free率很高,但是top查看java进程内存一直占用79.1%。
    是不是因为设置了-Xms为10G,尽管GC了,也不会降低占用整个分配的物理内存呢?

    作者回复: 如果内存一直没有释放,我想跟内存设置比例没有关系,可能是引用没有释放,尝试在传完之后手动释放内存试试

     1
    
  • SDL
    2019-09-26
    老师 为什么我用这个java -XX查看某个参数都没有相关信息输出的?就只有版本号那些信息呢

    作者回复: java -X可以查看部分JVM参数信息

    
    
  • 小笨蛋
    2019-09-17
    请问堆内存的分配有没有一个大概的标准😭既然都提到了不能太大也不能太小

    作者回复: 需要根据自己的项目来具体做配置,如果不清除具体需要的配置大小,使用默认配置就可以了

    
    
  • 风轻扬
    2019-09-10
    老师,如果允许分配担保机制失败。那即使老年代的空间不足以吃下年轻代的对象。jvm也会冒险进行minor gc的。gc之后,如果老年代还是吃不下对象,这个时候才会Full GC。那关闭这个分配担保机制,感觉好一点啊,反正有Full GC兜底呢😃

    作者回复: 打开分配担保机制,是为了避免Full GC过于频繁。

    
    
  • 疯狂咸鱼
    2019-09-03
    ab压测是什么工具的

    作者回复: 是一种简单的压力测试工具,可以网上查询下资料

    
    
  • 又双叒叕是一年啊
    2019-08-29
    你好,请问G1调优能不能也讲讲。主要应该注意些什么和cms这种调优的差异

    作者回复: 嗯,在后面的答疑课堂中讲到了,有问题欢迎提出

    
    
  • 高鑫
    2019-07-25
    大大,有个问题请教。如果survivor区不能容纳eden区的活跃对象,那么这些对象会直接晋升到oldgen么?能否详述一下对象晋升的流程🥰
     1
    
  • 晓杰
    2019-07-17
    可以通过directBuffer创建堆外内存,full gc可以对堆外内存进行回收
    
    
  • 晓杰
    2019-07-17
    full gc会对堆外内存进行回收
    
    
  • 歪曲丶
    2019-07-17
    Unsafe DirectByteBuffer都可以直接开辟堆外内存 啥时候回收 可以在full gc的时候回收 难的是堆外的阈值设定 监控堆外内存 jmx好像取不到堆外的大小了吧 之前看到R大在1.7的时候粗略的算下的 有种可能是老年代引用堆外的引用 但是old gc或者full gc迟迟不gc 那堆外就有可能oom
    
    
我们在线,来聊聊吧