A. java中的堆外内存具体是怎么实现的
在Java领域,堆外内存的概念被广泛应用于Netty和JDK等库中,通过DirectBuffer实现。DirectBuffer在底层调用系统提供的资源来分配内存,而非依赖Java堆区。具体来说,Unsafe类底层调用系统调用来实现内存分配。这里可能涉及os::malloc或者mmap。
os::malloc和mmap是实现堆外内存分配的两种方法。os::malloc直接从操作系统内存池中分配内存,而mmap则映射操作系统物理内存到应用程序的虚拟地址空间,提供文件映射或共享内存的高效访问方式。两者都是系统调用,用于提供低级别的内存管理。
关于堆外内存的存储位置,它被分配在用户态管理的内存区域。选择用户态内存而非内核态内存的原因,主要是为了提高数据访问效率和降低内存管理开销。内核态内存由操作系统管理,访问速度通常较慢且需要额外的开销。
理解系统调用、mmap、内核态和用户态的概念对于深入掌握堆外内存的实现至关重要。系统调用是操作系统提供的接口,允许应用程序执行底层操作,如内存分配、文件操作等。mmap允许程序以高效的内存映射方式访问文件或共享内存。内核态和用户态则是操作系统管理进程的方式,用户态运行应用程序,内核态则处理系统级任务。掌握这些基础概念有助于更好地理解Java内存管理和多线程编程。
B. 新建一个JAVA线程,占用的是JAVA堆内存还是操作系统的内存
Thread对象本身是在堆内存创建的,调用start()后开辟的线程空间是属于栈内存的。内存管理在Java语言中是JVM自动操作的,当JVM发现某些对象不再需要的时候,就会对该对象占用的内存进行重分配(释放)操作,而且使得分配出来的内存能够提供给所需要的对象。
在一些编程语言里面,内存管理是一个程序的职责,但是书写过C++的程序员很清楚,如果该程序需要自己来书写很有可能引起很严重的错误或者说不可预料的程序行为,最终大部分开发时间都花在了调试这种程序以及修复相关错误上。
相关信息
在以前的编程过程中,手动内存管理带了计算机程序不可避免的错误,而且这种错误对计算机程序是毁灭性的,所以内存管理就成为了一个很重要的话题,但是针对大多数纯面向对象语言而言,比如Java,提供了语言本身具有的内存特性。
自动化内存管理,这种语言提供了一个程序垃圾回收器(Garbage Collector[GC]),自动内存管理提供了一个抽象的接口以及更加可靠的代码使得内存能够在程序里面进行合理的分配。最常见的情况就是垃圾回收器避免了悬挂引用的问题。
因为一旦这些对象没有被任何引用“可达”的时候,也就是这些对象在JVM的内存池里面成为了不可引用对象,该垃圾回收器会直接回收掉这些对象占用的内存,当然这些对象必须满足垃圾回收器回收的某些对象规则,而垃圾回收器在回收的时候会自动释放掉这些内存。