• 13576788017
    2018-05-31
    杨老师,想问一下,一般要几年java经验才能达到看懂你文章的地步??我将近一年经验。。我发现我好几篇都看不懂。。底层完全不懂。。是我太菜了吗。。

    作者回复: 非常抱歉,具体哪几篇?公司对一年经验的工程师要求应该也不一样的

     2
     99
  • 行者
    2018-05-31
    可以利用NIO分散-scatter机制来写入不同buffer。
    Code:
    ByteBuffer header = ByteBuffer.allocate(128);
    ByteBuffer body = ByteBuffer.allocate(1024);
    ByteBuffer[] bufferArray = {header, body};
    channel.read(bufferArray);
    注意:该方法适用于请求头长度固定。
    展开

    作者回复: 赞

    
     70
  • 乘风破浪
    2018-05-31
    零拷贝是不是可以理解为内核态空间与磁盘之间的数据传输,不需要再经过用户态空间?

    作者回复: 嗯

    
     23
  • 闭门造车
    2018-06-06
    你好,我查看jdk8中的源码,看到您说的关于Files.copy其中两种是依靠transferto实现的,但是我翻看源码觉得跟您的理解不同,特来求证,源码如下: public static long copy(Path source, OutputStream out) throws IOException {
            Objects.requireNonNull(out);
            try (InputStream in = newInputStream(source)) {
                return copy(in, out);
            }
        }
            private static long copy(InputStream source, OutputStream sink)
            throws IOException
        {
            long nread = 0L;
            byte[] buf = new byte[BUFFER_SIZE];
            int n;
            while ((n = source.read(buf)) > 0) {
                sink.write(buf, 0, n);
                nread += n;
            }
            return nread;
        }
    展开
     3
     11
  • vash_ace
    2018-06-01
    其实在初始化 DirectByteBuffer对象时,如果当前堆外内存的条件很苛刻时,会主动调用 System.gc()强制执行FGC。所以一般建议在使用netty时开启XX:+DisableExplicitGC

    作者回复: 对,检测不够时会尝试调system.gc,记得老版本有并发分配bug,会出oom;netty,文中提到了,它是hack到内部自己释放...

     2
     8
  • 石头狮子
    2018-05-31
    若使用非 directbuffer 操作相关 api 的话,jdk 会将其复制为 ditrctbuff。并且在线程内部缓存该directbuffer。jdk 对这个缓存的大小并没有限制。
    之前遇到缓存的 directbuffer 过多,导致oom的情况。后续 jdk 版本加入了对该缓存的限制。
    额外一点是尽量不要使用堆内的 bytebuffer 操作 channel 类 api。
    
     7
  • CC
    2018-06-07
    我Nio从没接触过,很难受,两年开发的

    作者回复: 不用担心,是理解有难度吗?

    
     6
  • mongo
    2018-05-31
    杨老师,我也想请教,目前为止您的其他文章都理解的很好,到了上次专栏的NIO我理解的不是很好,今天的这篇可以说懵圈了。到了这一步想突破,应该往哪个方向?我自己感觉是因为基于这两个底层原理的上层应用使用的时候观察的不够深入,对原理反应的现象没有深刻感受,就是所谓还没有摸清楚人家长什么样。所以接下来我会认真在使用基于这些原理实现的上层应用过程中不断深挖和观察,比如认真学习dubbo框架(底层使用到了netty,netty的底层使用了NIO)来帮助我理解NIO。在这个过程中促进对dubbo的掌握,以此良性循环。不知道方向对不对?老师的学习方法是什么?请老师指点避坑。学习方法不对的话时间成本太可怕。

    作者回复: 我觉得思路不错,结合实践是非常好的;我自身也仅仅是理论上理解,并没有在大规模实践中踩坑,实践中遇到细节的“坑”其实是宝贝,所以你有更多优势;本文从基础角度出发,也是希望对其原理有个整体印象,至少被面试刨根问底时,可以有所准备,毕竟看问题的角度是不同的

    
     6
  • 夏洛克的救赎
    2018-05-31
    请问老师您有参与jdk的开发吗

    作者回复: 是的,目前lead的团队主要是QE职责

    
     5
  • 灰飞灰猪不会灰飞.烟...
    2018-05-31
    老师,带缓冲区的io流比nio哪一个性能更好?

    作者回复: 嗯,文中提到过,不能一概而论,性能通常是特定场景下的比较才有意义

    
     4
  • Len
    2018-05-31
    请教老师:
    1. 经常看到 Java 进程的 RES 大小远超过设置的 Xmx,可以认为这就是 Direct Memory 的原因吗?如果是的话,可以简单的用堆实际占用的大小减去 RES 就是 Direct Memory 的大小吗?

    2.可以认为 Direct Memory 不论在什么情况下都不会引起 Full GC,Direct Memory 的回收只是在 Full GC (或调用 System.gc())的时候顺带着回收下,是吗?
    展开

    作者回复: 1,一般不是,那东西有个默认大小的,metaspace codecache等等都会占用,后面有章节仔细分析
    2,不是,它是利用sun.misc.Cleaner, 实际表现有瑕疵,经常要更依赖system gc去触发引用处理,9和8u有改进,我会有详解

    
     4
  • 皮蛋
    2018-11-02
    杨老师,想问下如果想学操作系统的知识,阅读什么书比较适合,初学者

    作者回复: 可以看看《深入理解计算机系统》,如果有精力,再找本linux内核并配合实验,会很有用

    
     3
  • 美国的华莱士
    2019-03-30
    国外的这遍文章写的还不错,偏基础的可以参考下:
    https://www.journaldev.com/861/java-copy-file
     1
     2
  • 老陈板
    2019-02-17
    本篇文章有恍然大悟的感觉,前面段时间有一家面试问了个这样的问题,我们发现服务器内存使用得特别高,但是堆内存也比较稳定,这种场景是你你会怎么排查?这里就涉及到堆外内存相关的问题!以前不知道有NMT这个工具,然后当时没答好,导致工资少了好多,早点读这篇文章多好。另外注意,sysyem.gc不一定会立即触发fgc,有个权值

    作者回复: 一个常见例子是,创建了一堆线程,实际占用内存(RSS)远比堆本身大

    
     2
  • 罗飞
    2019-01-10
    零拷贝,是DMA 数据传输,完全由硬件实现的,内核只是起到控制设置作用,不要误人子弟好么

    作者回复: 谢谢,建议搜索下Java DMA或者相关的RDMA;
    实时上这是个一直在发展的领域,虽然因为种种原因应用场景有限,最新的API发展如RDMA相关,可以了解下 http://openjdk.java.net/jeps/337

    
     2
  • Quincy
    2018-08-08
    老师,我想问下,transferto是怎么实现的零拷贝,而避免了用户态和内核态之间转换的开销
     1
     2
  • 玲玲爱学习
    2018-06-28
    堆外缓存是否与内核缓存是同一个东西?
    
     2
  • Cui
    2018-05-31
    Direct Buffer 生命周期内内存地址都不会再发生更改,进而内核可以安全地对其进行访问—这里能提高性能的原因 是因为内存地址不变,没有锁争用吗?能否详细解答下?

    作者回复: 我理解不是锁的问题,寻址简单,才好更直接

    
     2
  • godtrue
    2018-12-15
    有同感,Java IO这块学起来坡度明显陡峭了,上午看各种IO就有点不在状态,估计更偏向操作系统层面了吧!
    不过我又回头看了漫画编程上关于Java IO的文章,感觉轻松自在很多,理解同步,异步,阻塞,非阻塞,各种IO的特点丝毫不费劲,估计是漫画和更通俗的原因吧!
    老师,讲文件拷贝最快的方式有数据依据吗?还是就是推论?感觉不是很确定,需要依据具体情况来定?
    
     1
  • 帅子
    2018-12-13
    我是做安卓开发的,对于深入理解您的文章,是否对安卓开发有帮助呢?
     1
     1
我们在线,来聊聊吧