• 冬渐暖
    2019-11-28
    节省内存的一些技巧
    1.能用基本类型尽量用基本类型,就不要去用包装类型了,包装类明显占用的空间更大,之前有说到,包装类除了值,还带了一些信息,比如hash之些的对象头,还有引用地址
    2.一些类定义的属性变量,就直接在这个类里面定义,不要跑到引用的地方去一个一个的重新定义。
    3.创建一些需要提前设置好大小的东西的时候,先去看下装进来的东西有多少(如果不知道就去猜),然后把这个值set进去。比如hashmap的丢弃原数组暴力扩容不如先设置好适合的大小。 不过如果改了jvm的这个负载因子0.75,这些地方还根据0.75判断,就凉凉咯
    4.zero-copy 将数据组合到一起,而不是内存的复制
    5.内存池:1.循环利用
       2.省的用一次创建一次,开始的时候直接给你全部都创好(感觉这样的话会拖慢启动速度,而且也要维护这些东西。。。。)
       3.支持并发:一下子可以拿好多个

    堆外内存:直接受操作系统管理(而不是虚拟机),jvm只是拿一个引用
    好处是1.增大了空间(原来你只有个jvm的,现在你又多了个)
        2.减少辣鸡回收。辣鸡回收会让其它的工作暂停
        3.堆内在flush到远程时,会先复制到直接内存(非堆内存),然后在发送;而堆外内存相当于省略掉了这个工作。
    缺点是1.难管:因为操作系统管的,所以不容易控制,
        2.创建慢
        3.不容易排查(内存溢出的时候)


    堆外内存和非堆内存是不一样的,非堆是比如栈一类的,还是在jvm内部。堆外在外面



    这章可以看出,netty在某些方面并不是最优的,不同的场景或许有更好的选择,或许没有
    展开

    作者回复: “netty在某些方面并不是最优的”,肯定的,不然这15年来就不会一直在持续优化改进了,所以可怕的不是已经做到最好,而是一直还在改进,哈哈

    
     1
  • 高源
    2019-11-02
    老师请教问题,我开发服务端程序,下面有多个客户端连接发送消息,socket tcp通信方式,现在发现如果多个客户端发送,并发消息多了,根据日志分析发现服务端接收的就晚了,导致客户端记录超时,这种情况怎么解决啊,是服务端处理能力不行吗,另外还有一种情况是客户端发消息了,但服务端没有收到导致超时。这两种情况我该怎么处理呢😊希望老师指点江山啊😊

    作者回复: 因为不知道你的程序到底是什么样的,只能从描述上推测可能的情况,是不是你的业务线程是复用NioEventLoop的,也就是没有单独搞一个线程池去处理,这样的话,如果你的任务比较重(单个任务处理很耗时),那就会影响到你的IO处理(收发),自然也就慢了,你看下是不是这个情况。

    
     1
  • 13761642169
    2020-01-23
    我是从 rocketMQ 到的 netty,rmq 里面用到了FileRegion,具体这里面的优势在哪
    
    
  • 13761642169
    2020-01-23
    还有就是,我看到网上的说法,堆外内存IO比堆内内存IO效率高,减少了一次拷贝。说是,java IO时,会先从堆内拷堆外,然后才是写到 socket buffer,原因是 Java gc 会改变对象的内存地址
    
    
  • 13761642169
    2020-01-23
    我看着您的课程,然后仔细去撸了 netty 的源码,感觉水挺深。光内存分配这块,首先是对象池,然后是内存的管理,大量使用 thread local,还有虚引用。再感觉就是 pipeline,这块始终串不起来,通常见到的 pipeline,都是在一条流水线上执行同一个方法,像 filter 那样,但 netty 的 pipeline,write 一个对象出去,调到了 MessageToByte 的 encode 方法
    
    
  • 13761642169
    2019-10-25
    DirectByteBuffer 是堆外内存。把 JVM 进程当作一个普通进程,堆外内存是原来“堆”的一部分吗?

    作者回复: 不是,jvm里面的堆相当于数据,栈算动作,所以加一起,堆栈,而堆外内存自然属于堆“外”。

     2
    
我们在线,来聊聊吧