首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Java NIO、Channel、Selector 详解

I/O,其内存不会分配在堆上,不会占用应用程序的内存。...可以通过类中的 allocateDirect 工厂方法创建 direct buffer,这个方法创建的 direct buffer 通常比 non-direct buffer 具有更高的分配和释放成本。...所以建议将 direct buffer 分配给大型、寿命长的、受底层操作系统 I/O 操作约束的缓冲区。 可以通过调用 isDirect 方法判断 byte buffer 是否是 direct 的。...) { ... } 我们可以将缓冲区的数据传输到 Channel 中: 通过 FileChannel 将数据写到文件中 通过 SocketChannel 将数据写入网络,发送到远程机器 int...:TCP 对应的服务端,用于监听某个端口进来的请求 读操作:将数据从 Channel 读取到 Buffer 中 int read = channel.read(buffer); 写操作:将数据从 Buffer

1.2K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    深入理解JAVA中的NIO

    通道不能单独存在,它永远需要绑定一个缓存区,所有的数据只会存在于缓存区中,无论你是写或是读,必然是缓存区通过通道到达磁盘文件,或是磁盘文件通过通道到达缓存区。...我们看这么一段代码,这段代码我大致分成了四个部分,第一部分用于获取文件通道,第二部分用于分配缓存区并完成读操作,第三部分用于将缓存区中数据进行打印,第四部分为关闭通道连接。...HeapByteBuffer 是虚拟机的堆上内存,所有数据都将存储在堆空间,我们不久将会介绍它的一个兄弟,DirectByteBuffer,它被分配在堆外内存中,具体的一会说。...否则,虚拟机将在直接内存区域分配一块内存,该内存区域的首地址存储在 var5 实例的 address 属性中。 接着从磁盘读取数据放入 var5 所代表的直接内存区域中。...提醒一下,想要更好的使用这个通道和缓存区进行文件读写操作,你就一定得对缓存区的几个变量的值时刻把握住,position 和 limit 当前的值是什么,大致什么位置,一定得清晰,否则这个读写共存的缓存区可能会让你晕头转向

    68460

    基础总结 (Go篇)

    sendx/recvx(队列下标用于数组循环队列)、sendq(等待写消息队列)、recvq(等待读消息队列)、elemtype(元素的类型) 写:如果缓冲区中没有空余位置,将待发送数据写入G,将当前G...加入sendq,进入睡眠,等待被读goroutine唤醒; 读:如果缓冲区中没有数据,将当前goroutine加入recvq,进入睡眠,等待被写goroutine唤醒; Channel里是有runtime.mutex...ValueOf变量:会把变量显示地拷贝一份并逃逸到堆上留下拷贝变量的指针、ValueOf变量指针:会把原变量逃逸到堆上并留下原变量的指针。ValueOf增加了堆分配开销和GC开销。...bitmap区域中一个字节对应了arena区域中的四个指针大小的内存, 即2bit对应一个指针大小的内存,标识需不需要在扫描,就是垃圾回收用的。...):https://segmentfault.com/a/1190000040450335 golang逃逸分析指令:go build -gcflags '-m' 栈对象逃逸到堆上,少逃逸是为了减少对象在堆上分配

    43620

    万万没想到,JVM内存结构的面试题可以问的这么难?

    9、Java中的对象一定在堆上分配内存吗? 10、如何获取堆和栈的dump文件?...,虽然方法区是堆的逻辑组成部分,但是简单的虚拟机实现可以选择在这个区域不实现垃圾收集与压缩。... Q3:运行时数据区中哪些区域是线程共享的?哪些是独享的? 在JVM运行时内存区域中,PC寄存器、虚拟机栈和本地方法栈是线程独享的。 而Java堆、方法区是线程共享的。...(关于逃逸分析和栈上分配可以参考:深入理解Java中的逃逸分析、对象并不一定都是在堆上分配内存的) ?  Q10:怎么如何获取堆和栈的dump文件? Java Dump,Java虚拟机的运行时快照。...将Java虚拟机运行时的状态和信息保存到文件。 可以使用在服务器上使用jmap命令来获取堆dump,使用jstack命令来获取线程的调用栈dump。

    62940

    详解 Java NIO

    通道不能单独存在,它永远需要绑定一个缓存区,所有的数据只会存在于缓存区中,无论你是写或是读,必然是缓存区通过通道到达磁盘文件,或是磁盘文件通过通道到达缓存区。...,第二部分用于分配缓存区并完成读操作,第三部分用于将缓存区中数据进行打印,第四部分为关闭通道连接。...HeapByteBuffer 是虚拟机的堆上内存,所有数据都将存储在堆空间,我们不久将会介绍它的一个兄弟,DirectByteBuffer,它被分配在堆外内存中,具体的一会说。...否则,虚拟机将在直接内存区域分配一块内存,该内存区域的首地址存储在 var5 实例的 address 属性中。 接着从磁盘读取数据放入 var5 所代表的直接内存区域中。...提醒一下,想要更好的使用这个通道和缓存区进行文件读写操作,你就一定得对缓存区的几个变量的值时刻把握住,position 和 limit 当前的值是什么,大致什么位置,一定得清晰,否则这个读写共存的缓存区可能会让你晕头转向

    44610

    万万没想到,JVM内存结构的面试题可以问的这么难?

    ,虽然方法区是堆的逻辑组成部分,但是简单的虚拟机实现可以选择在这个区域不实现垃圾收集与压缩。...Q3:运行时数据区中哪些区域是线程共享的?哪些是独享的? 在JVM运行时内存区域中,PC寄存器、虚拟机栈和本地方法栈是线程独享的。 而Java堆、方法区是线程共享的。...Q9:Java中的对象一定在堆上分配内存吗?...(关于逃逸分析和栈上分配可以参考:深入理解Java中的逃逸分析、对象并不一定都是在堆上分配内存的) ? Q10:怎么如何获取堆和栈的dump文件? Java Dump,Java虚拟机的运行时快照。...将Java虚拟机运行时的状态和信息保存到文件。 可以使用在服务器上使用来获取堆dump,使用来获取线程的调用栈dump。

    74420

    Java底层-运行时数据区

    在前面关于HotSpot组成中提到,运行时数据区就类似一个工厂,是Java程序运行所在的内存区域,这个区域被JVM所管理,按照虚拟机规范的规定将其划分为:方法区、堆、程序计数器,虚拟机栈、本地方法栈五个部分...下面我们具体来看每一块区域: 方法区 在前面我们谈论类加载器的时候,我们说过类加载的目的是将 Class 文件加载到JVM的方法区中,然后在内存中实例化一个java.lang.Class的对象, 关于实例化的...元空间替代永久代作为方法区的实现,虽然OOM的可能性降低,但方法区仍然是GC回收的区域(一般都伴随着Full GC进行内存释放) 堆 在Java虚拟机运行时数据区中,堆内存是各类区域中内存中最大的一块,...在Java虚拟机规范中明确的描述了:所有对象实例以及数组都要在堆上分配内存空间(随着HotSpot虚拟机中JIT的成熟,对象并不一定在堆上分配,栈上分配也是有可能的)。...举个简单的例子Java语言是支持多线程的,线程的切换之后, 那么当前线程可能会进行等待,那么当前线程再次获取到CPU资源的时候,如何从切换前的地方开始执行程序呢?

    64410

    NIO详解

    ,在jvm堆上申请堆上内存 如果要做IO操作,会先从本进程的堆上内存复制到系统内存,再利用本地IO处理 读写效率较低,受到 GC 的影响 ByteBuffer heapByteBuffer = ByteBuffer.allocate...分配一个指定大小的缓冲区 ByteBuffer buf = ByteBuffer.allocate(10); // 2....java 本身并不具备 IO 读写能力,因此 read 方法调用后,要从 java 程序的用户态切换至内核态,去调用操作系统的读能力,将数据读入内核缓冲区。...这期间用户线程阻塞,操作系统使用 DMA(可以理解为硬件单元)来实现文件读,其间也不会使用 cpu 从内核态切换回用户态,将数据从内核缓冲区读入用户缓冲区(即 byte[] buf),这期间 cpu 会参与拷贝...缓冲区,几乎无消耗 使用 DMA 将内核缓冲区的数据写入网卡,不会使用 cpu 用户态与内核态的切换次数与数据拷贝次数 用户态与内核态的切换发生了 1 次 数据拷贝了共 2 次 整个过程仅只发生了一次用户态与内核态的切换

    12410

    打工人,从 JMM 透析 volatile 与 synchronized 原理

    垃圾收集器的主要作用区域。 那一个对象创建的时候,到底是在堆上分配,还是在栈上分配呢?这和两个方面有关:对象的类型和在 Java 类中存在的位置。 Java 的对象可以分为基本数据类型和普通对象。...当你在方法体内声明了基本数据类型的对象,它就会在栈上直接分配。其他情况,通常在在堆上分配,逃逸分析的情况下可能会在栈分配。 注意,像 int[] 数组这样的内容,是在堆上分配的。...答:不是在堆上分配的,而是在堆外空间分配,方法区就是在元空间中。 字符串常量池在那个区域中?...它们都可以从主内存中去获取到这个信息,对两个线程来说 x 都是 0。...里吗读区到修改的值并停止执行。

    34520

    打工人,从 JMM 透析 volatile 与 synchronized 原理

    垃圾收集器的主要作用区域。 那一个对象创建的时候,到底是在堆上分配,还是在栈上分配呢?这和两个方面有关:对象的类型和在 Java 类中存在的位置。 Java 的对象可以分为基本数据类型和普通对象。...当你在方法体内声明了基本数据类型的对象,它就会在栈上直接分配。其他情况,通常在在堆上分配,逃逸分析的情况下可能会在栈分配。 注意,像 int[] 数组这样的内容,是在堆上分配的。...答:不是在堆上分配的,而是在堆外空间分配,方法区就是在元空间中。 字符串常量池在那个区域中?...它们都可以从主内存中去获取到这个信息,对两个线程来说 x 都是 0。...里吗读区到修改的值并停止执行。

    45500

    【JVM】深入了解Java虚拟机-------内存划分、类加载机制、垃圾回收机制

    1.堆 (共享) 堆是整个内存区域中最大的一块,放的内容就是代码new出来的对象 堆里面分为两个区域:新生代和老生代,在讲到后面GC垃圾回收机制会提到.... 2.栈 (私有) 分为Java虚拟机栈和本地方法栈...,它只需要保存当前要执行的下一条指令(JVM字节码)的地址 在上述四块区域中,堆和元数据区的数据是在整个进程只有一份,每个线程都可以访问到,是大家共同可以使用的;而栈和程序计数器是每个线程中有一份,是只能每个线程跟每个线程独立的...(在堆上) 基本判断方法: 1)局部变量在栈上 2)成员变量在堆上 3)静态变量或方法都在元数据上 JVM 类加载 一.类加载过程 一个java进程启动,要将.java文件转化成.class文件,加载到内存中...JVM的自身的安全; 3.准备 给类对象分配内存(元数据区),并设置类变量的初始值,如果类里有静态变量,那么值为0 /false /null 。。。...二.双亲委派模型 这个模型描述了JVM加载.class文件过程中,找文件的过程; 这个类加载中的 “双亲委派模型”出现在“加载”那个环节,根据代码中写的“全限定类名”找到对应的.class文件; 全限定类名

    12010

    从JMM透析volatile与synchronized原理,图文并茂

    垃圾收集器的主要作用区域。 那一个对象创建的时候,到底是在堆上分配,还是在栈上分配呢?这和两个方面有关:对象的类型和在 Java 类中存在的位置。 Java 的对象可以分为基本数据类型和普通对象。...对于普通对象来说,JVM 会首先在堆上创建对象,然后在其他地方使用的其实是它的引用。比如,把这个引用保存在虚拟机栈的局部变量表中。...当你在方法体内声明了基本数据类型的对象,它就会在栈上直接分配。其他情况,通常在在堆上分配,逃逸分析的情况下可能会在栈分配。 注意,像 int[] 数组这样的内容,是在堆上分配的。...元空间是在堆上么? 答:不是在堆上分配的,而是在堆外空间分配,方法区就是在元空间中。 字符串常量池在那个区域中?...这就代表了如果变量被 volatile 修饰,那么每次修改之后,接下来在读取这个变量的时候一定能读取到该变量最新的值。

    25620

    关于JVM内存的N个问题

    第四,堆(Heap),几乎所有创建的Java对象实例,都是被直接分配到堆上的。堆被所有的线程所共享,在堆上的区域,会被垃圾回收器做进一步划分,例如新生代、老年代的划分。...根据Java虚拟机规范的规定,当方法区无法满足内存分配需求时,将抛出OutOfMemoryError异常。...jmap也可以生成堆转储文件(Heap Dump)文件,如果是在linux上,可以将堆转储文件拉到本地来,使用Eclipse MAT进行分析,也可以使用jhap进行分析。...TLAB在堆上分配,位于Eden中。...当Eden区域内存不足时会触发Minor GC,也称为新生代GC,在Minor GC存活下来的对象,会被复制到Survivor区域中。我认为Survivor区的作用在于避免过早触发Full GC。

    47410

    关于JVM内存的N个问题

    第四,堆(Heap),几乎所有创建的Java对象实例,都是被直接分配到堆上的。堆被所有的线程所共享,在堆上的区域,会被垃圾回收器做进一步划分,例如新生代、老年代的划分。...根据Java虚拟机规范的规定,当方法区无法满足内存分配需求时,将抛出OutOfMemoryError异常。...jmap也可以生成堆转储文件(Heap Dump)文件,如果是在linux上,可以将堆转储文件拉到本地来,使用Eclipse MAT进行分析,也可以使用jhap进行分析。...TLAB在堆上分配,位于Eden中。...当Eden区域内存不足时会触发Minor GC,也称为新生代GC,在Minor GC存活下来的对象,会被复制到Survivor区域中。我认为Survivor区的作用在于避免过早触发Full GC。

    51220

    4 个关于Java 虚拟机内存的问题?

    第四,堆(Heap),几乎所有创建的Java对象实例,都是被直接分配到堆上的。堆被所有的线程所共享,在堆上的区域,会被垃圾回收器做进一步划分,例如新生代、老年代的划分。...根据Java虚拟机规范的规定,当方法区无法满足内存分配需求时,将抛出OutOfMemoryError异常。...jmap也可以生成堆转储文件(Heap Dump)文件,如果是在linux上,可以将堆转储文件拉到本地来,使用Eclipse MAT进行分析,也可以使用jhap进行分析。...TLAB在堆上分配,位于Eden中。...当Eden区域内存不足时会触发Minor GC,也称为新生代GC,在Minor GC存活下来的对象,会被复制到Survivor区域中。我认为Survivor区的作用在于避免过早触发Full GC。

    52610

    关于JVM内存的N个问题

    第四,堆(Heap),几乎所有创建的Java对象实例,都是被直接分配到堆上的。堆被所有的线程所共享,在堆上的区域,会被垃圾回收器做进一步划分,例如新生代、老年代的划分。...根据Java虚拟机规范的规定,当方法区无法满足内存分配需求时,将抛出OutOfMemoryError异常。...jmap也可以生成堆转储文件(Heap Dump)文件,如果是在linux上,可以将堆转储文件拉到本地来,使用Eclipse MAT进行分析,也可以使用jhap进行分析。...TLAB在堆上分配,位于Eden中。...当Eden区域内存不足时会触发Minor GC,也称为新生代GC,在Minor GC存活下来的对象,会被复制到Survivor区域中。我认为Survivor区的作用在于避免过早触发Full GC。

    1K20

    关于JVM内存的N个问题

    第四,堆(Heap),几乎所有创建的Java对象实例,都是被直接分配到堆上的。堆被所有的线程所共享,在堆上的区域,会被垃圾回收器做进一步划分,例如新生代、老年代的划分。...根据Java虚拟机规范的规定,当方法区无法满足内存分配需求时,将抛出OutOfMemoryError异常。...jmap也可以生成堆转储文件(Heap Dump)文件,如果是在linux上,可以将堆转储文件拉到本地来,使用Eclipse MAT进行分析,也可以使用jhap进行分析。...TLAB在堆上分配,位于Eden中。...当Eden区域内存不足时会触发Minor GC,也称为新生代GC,在Minor GC存活下来的对象,会被复制到Survivor区域中。我认为Survivor区的作用在于避免过早触发Full GC。

    53930

    站在操作系统层面看JVM

    如何将Natvie Heap中字节码区域中的字节码解释为本平台机器码然后执行,这个在Jvm Code中已经写好了,具体如何搞的,就是关于解释器那堆东西,不是本文重点。...在G1之前的其他收集器进行收集的范围都是整个新生代或者老年代,而G1打破了原有的分代模型,将堆划分为一个个区域。...操作系统会创建一个进程来执行这个java可执行程序,而每个进程都有自己的虚拟地址空间,JVM 用到的内存(包括堆、栈和方法区)就是从进程的虚拟地址空间上分配的。...HeapByteBuffer 对象本身在 JVM 堆上分配,并且它持有的字节数组byte[]也是在 JVM 堆上分配。...JVM 堆上分配的,而是从本地内存分配的。

    61830
    领券