加入收藏 | 设为首页 | 会员中心 | 我要投稿 威海站长网 (https://www.0631zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 资源网站 > 空间 > 正文

浅谈虚拟机内存区

发布时间:2019-04-12 03:36:34 所属栏目:空间 来源:Wooola
导读:1. Java 虚拟机内存区概述 我们在编写程序时,经常会遇到OOM(out of Memory)以及内存泄漏等问题。为了避免出现这些问题,我们首先必须对JVM的内存划分有个具体的认识。JVM将内存主要划分为:方法区、虚拟机栈、本地方法栈、堆、程序计数器。 2. Java 虚拟

A direct byte buffer may be created by invoking the allocateDirect factory method of this class. The buffers returned by this method typically have somewhat higher allocation and deallocation costs than non-direct buffers. The contents of direct buffers may reside outside of the normal garbage-collected heap, and so their impact upon the memory footprint(内存占用) of an application might not be obvious. It is therefore recommended that direct buffers be allocated primarily for large, long-lived buffers that are subject to the underlying system's native I/O operations. In general it is best to allocate direct buffers only when they yield a measureable gain in program performance.

但是由于直接内存使用allocateDirect创建,它比申请普通的堆内存需要耗费更高的性能。不过它不会占用应用的堆内存。所以,当你有大量数据要缓存时,并且它的生命周期又比较长,那么使用直接内存是个不错的选择。但如果该选择不能带来显著的性能提升,推荐使用堆内存。在JDK1.4的NIO中,ByteBuffer有个方法是:

  1. public static ByteBuffer allocateDirect(int capacity) { 
  2.  return new DirectByteBuffer(capacity); 
  3. DirectByteBuffer(int cap) { 
  4.  ...... 
  5.  protected static final Unsafe unsafe = Bits.unsafe(); 
  6.  unsafe.allocateMemory(size); 
  7.  ...... 
  8. public final class Unsafe { 
  9.  ...... 
  10.  public native long allocateMemory(long var1); 
  11.  ...... 

另外直接内受限于本机总内存(包括RAM及SWAP区或者分页文件)的大小及处理器寻址空间的限制。

服务器管理员配置虚拟机参数时,一般会根据实际内存设置-Xmx等参数信息,但经常会忽略掉直接内存,使得各个内存区域的总和大于物理内存限制(包括物理上的和操作系统级的限制),从而导致动态扩展时出现OutOfMemoryError异常。

2.7.2 直接内存的特点

  • 不受Java堆大小的限制
  • 既不是虚拟机运行时数据区的一部分,也不是Java虚拟机规范中定义的内存区域,不会占用应用的内存
  • IO操作上具有更高的性能,因为它直接作用于本地系统的IO操作
  • 它比申请普通的堆内存需要耗费更高的性能。

2.7.3 直接内存的异常

动态扩展时出现OutOfMemoryError异常

2.7.4 直接内存的作用

基于通道(Channel)与缓冲区(Buffer)的I/O方式,它可以使用Native函数库直接分配堆外内存,然后通过一个存储在Java堆里面的DirectByteBuffer对象作为这块内存的引用进行操作。这样能在一些场景中显著提高性能,因为避免了在Java堆和Native堆中来回复制数据。

2.7.5 直接内存的运用

XX:MaxDirectMemorySize=10M

2.7.6 直接内存的使用场景

例如在IO处理时,比如网络发送大量数据时,直接内存会具有更高的效率。

本文基于jdk1.6、1.7

【编辑推荐】

  1. 程序员从宏观、微观角度浅析JVM虚拟机!
  2. 一文带你全面了解虚拟机的四种网络模型(图文并茂)
  3. 听说又被 JVM 内存区域方面的面试题给虐了?看看这篇文章吧!
  4. Type 1和Type 2虚拟机管理程序有什么区别?
  5. 确保云计算中虚拟机安全的4个步骤
【责任编辑:武晓燕 TEL:(010)68476606】
点赞 0

(编辑:威海站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读