java 申请堆外内存吗? java如何使用堆外内存?

这篇具有很好参考价值的文章主要介绍了java 申请堆外内存吗? java如何使用堆外内存?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

java 申请堆外内存吗? java如何使用堆外内存?

Java堆外内存管理

JVM可以使用的内存分外2种:堆内存和堆外内存:

  • 堆内存完全由JVM负责分配和释放,如果程序没有缺陷代码导致内存泄露,那么就不会遇到java.lang.OutOfMemoryError这个错误。

  • 使用堆外内存,就是为了能直接分配和释放内存,提高效率。JDK5.0之后,代码中能直接操作本地内存的方式有2种:使用未公开的Unsafe和NIO包下ByteBuffer。

  • 使用ByteBuffer分配本地内存则非常简单,直接ByteBuffer.allocateDirect(10 * 1024 * 1024)即可。

  • C语言的内存分配和释放函数malloc/free,必须要一一对应,否则就会出现内存泄露或者是野指针的非法访问。java中我们需要手动释放获取的堆外内存吗?

  • 我们一起来看看NIO中提供的ByteBuffer

  • java 申请堆外内存吗? java如何使用堆外内存?,JAVA基础工作中实际总结,编程学习,java,开发语言,数据库,windows,服务器

  • 我们将最大堆外内存设置成40M,运行这段代码会发现:程序可以一直运行下去,不会报OutOfMemoryError。如果使用了-verbose:gc -XX:+PrintGCDetails,会发现程序频繁的进行垃圾回收活动。那么DirectByteBuffer究竟是如何释放堆外内存的?

  • 我们修改下JVM的启动参数,重新运行之前的代码:

  • java 申请堆外内存吗? java如何使用堆外内存?,JAVA基础工作中实际总结,编程学习,java,开发语言,数据库,windows,服务器

  • 与之前的JVM启动参数相比,增加了-XX:+DisableExplicitGC,这个参数作用是禁止代码中显示调用GC。代码如何显示调用GC呢,通过System.gc()函数调用。如果加上了这个JVM启动参数,那么代码中调用System.gc()没有任何效果,相当于是没有这行代码一样。

  • java 申请堆外内存吗? java如何使用堆外内存?,JAVA基础工作中实际总结,编程学习,java,开发语言,数据库,windows,服务器

  • 显然堆内存(包括新生代和老年代)内存很充足,但是堆外内存溢出了。也就是说NIO直接内存的回收,需要依赖于System.gc()。如果我们的应用中使用了java nio中的direct memory,那么使用-XX:+DisableExplicitGC一定要小心,存在潜在的内存泄露风险。

  • 我们知道java代码无法强制JVM何时进行垃圾回收,也就是说垃圾回收这个动作的触发,完全由JVM自己控制,它会挑选合适的时机回收堆内存中的无用java对象。代码中显示调用System.gc(),只是建议JVM进行垃圾回收,但是到底会不会执行垃圾回收是不确定的,可能会进行垃圾回收,也可能不会。什么时候才是合适的时机呢?一般来说是,系统比较空闲的时候(比如JVM中活动的线程很少的时候),还有就是内存不足,不得不进行垃圾回收。我们例子中的根本矛盾在于:堆内存由JVM自己管理,堆外内存必须要由我们自己释放;堆内存的消耗速度远远小于堆外内存的消耗,但要命的是必须先释放堆内存中的对象,才能释放堆外内存,但是我们又不能强制JVM释放堆内存。文章来源地址https://www.toymoban.com/news/detail-738122.html

Direct Memory的回收机制:

  • Direct Memory是受GC控制的,例如ByteBuffer bb = ByteBuffer.allocateDirect(1024),这段代码的执行会在堆外占用1k的内存,Java堆内只会占用一个对象的指针引用的大小,堆外的这1k的空间只有当bb对象被回收时,才会被回收,这里会发现一个明显的不对称现象,就是堆外可能占用了很多,而堆内没占用多少,导致还没触发GC,那就很容易出现Direct Memory造成物理内存耗光。
  • Direct ByteBuffer分配出去的内存其实也是由GC负责回收的,而不像Unsafe是完全自行管理的,Hotspot在GC时会扫描Direct ByteBuffer对象是否有引用,如没有则同时也会回收其占用的堆外内存。
  • 使用堆外内存与对象池都能减少GC的暂停时间,这是它们唯一的共同点。生命周期短的可变对象,创建开销大,或者生命周期虽长但存在冗余的可变对象都比较适合使用对象池。生命周期适中,或者复杂的对象则比较适合由GC来进行处理。然而,中长生命周期的可变对象就比较棘手了,堆外内存则正是它们的菜。

堆外内存的好处是:

  • 可以扩展至更大的内存空间。比如超过1TB甚至比主存还大的空间;
  • 理论上能减少GC暂停时间;
  • 可以在进程间共享,减少JVM间的对象复制,使得JVM的分割部署更容易实现;
  • 它的持久化存储可以支持快速重启,同时还能够在测试环境中重现生产数据
  • 站在系统设计的角度来看,使用堆外内存可以为你的设计提供更多可能。最重要的提升并不在于性能,而是决定性的。

到了这里,关于java 申请堆外内存吗? java如何使用堆外内存?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • java八股文面试[多线程]——主内存和工作内存的关系

    JAVA内存模型(JMM) 共享变量 :如果一个变量在多个线程的工作内存中 都存在副本 ,那么这个变量就是这几个线程的共享变量。 上面的工作内存其实是java内存模型 抽象出来的概念 ,下面简要介绍一下java内存模型(JMM)。 java内存模型( java memory model ): 描述了java程序中各

    2024年02月10日
    浏览(47)
  • jvm堆外内存排查详解

    内存泄漏想必大家并不陌生,对于jvm的内存泄漏,有很多排查手段和方便的排查工具,例如MAL,但是对于非jvm的内存,如直接内存的使用,排查起来较为麻烦,下面介绍一下相关的排查手段 在一次内存检查的过程中,意外发现在linux的java进程内存占用,远高于jvm的内存设定最

    2024年02月08日
    浏览(37)
  • JVM 堆外内存查看方法

    是否曾经想过为什么Java应用程序通过众所周知的*-Xms 和 -Xmx 调整标志消耗的内存比指定的数量大得多 ?由于各种原因和可能的优化,JVM可能会分配额外的本机内存。这些额外的分配最终可能使消耗的内存超出 -Xmx* 限制。 在本教程中,我们将枚举JVM中本机内存分配的一些常见

    2024年02月07日
    浏览(39)
  • 关于 java如何集成chatgpt,如何集成到html5前端界面,如何实现多伦对话,如何申请域名,如何申请服务器,搭建环境(一)

    Java如何集成ChatGPT,如何集成到HTML5前端界面,如何实现多伦对话 随着人工智能技术的不断发展,聊天机器人已经成为了人们日常生活中不可或缺的一部分。ChatGPT是一种基于自然语言处理技术的聊天机器人,它可以通过对话来理解用户的需求,并给出相应的回答。在本文中,

    2024年02月03日
    浏览(75)
  • JAVA基础 - java -cp 如何使用?

    使用场景 java -cp 命令用于指定JAVA程序运行时所依赖的JAR文件,它的基本语法如下: 注意事项 (1)path/to/class/files:JAVA类文件所在的目录或JAR包文件路径,多个路径之间用分号(Windows)或冒号(Unix/Linux)分隔; (2)MainClass:包含MAIN方法的JAVA类的全限定类名; (3)-cp 和

    2024年02月13日
    浏览(28)
  • JAVA基础 - 如何使用split方法?

    写在前面 在工作中一直使用split进行字串的分隔,但是始终没有认真研究过该方法,今天在使用该方法时遇到了一些问题,特进行学习记录。 遇到的问题 在使用“|”作为字串的分隔符的时候,分隔结果和预期不一样。 方法定义 // 从方法的实现上, 可以了解split的参数可以是

    2024年02月04日
    浏览(29)
  • 【C/C++】基础知识之动态申请内存空间new-delete

    创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡𖥦)!! 主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步! 🔥c++系列专栏:C/C++零基础到精通 🔥 给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ c语言内容💖:

    2024年02月07日
    浏览(51)
  • gateway报 netty堆外内存溢出问题解决io.netty.util.internal.OutOfDirectMemoryError

    昨天线上网关突然无法访问。打开日志看到错误信息“io.netty.util.internal.OutOfDirectMemoryError” 堆外内存溢出。。这也没碰到过啊,看来今天准点下班的愿望又落空了。老规矩面向百度编程。先看看网上有没有其他兄弟碰到这个问题。一顿搜索之后发现,很多博客都是一知半解并

    2024年02月10日
    浏览(62)
  • Linux内存从0到1学习笔记(6.12 应用程序是如何申请内存的呢?)

        前面提到了应用程序大多基于glibc的malloc/free进行内存的分配。这里不讨论共享内存,因为共享内存都是预先分配好的,所以由共享内存mmap和shm所设计的内存泄漏比较少见。     接下来我们从应用调用的维度来看下,应用程序都有哪些调用入口,以及它们是如何申请和释

    2024年02月03日
    浏览(64)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包