对于有Java开发经验的朋友都知道,Java中不需要手动的申请和释放内存,JVM会自动进行垃圾回收;而使用的内存是由JVM控制的。

那么,什么时机会进行垃圾回收,如何避免过度频繁的垃圾回收?如果JVM给的内存不够用,怎么办?

此时,堆外内存登场!利用堆外内存,不仅可以随意操控内存,还能提高网络交互的速度。

背景1:JVM内存的分配

对于JVM的内存规则,应该是老生常谈的东西了,这里我就简单的说下:

新生代:一般来说新创建的对象都分配在这里。

年老代:经过几次垃圾回收,新生代的对象就会放在年老代里面。年老代中的对象保存的时间更久。

永久代:这里面存放的是class相关的信息,一般是不会进行垃圾回收的。

背景2:JVM垃圾回收

由于JVM会替我们执行垃圾回收,因此开发者根本不需要关心对象的释放。但是如果不了解其中的原委,很容易内存泄漏,只能两眼望天了!

垃圾回收,大致可以分为下面几种:

Minor GC:当新创建对象,内存空间不够的时候,就会执行这个垃圾回收。由于执行最频繁,因此一般采用复制回收机制。

Major GC:清理年老代的内存,这里一般采用的是标记清除+标记整理机制。

Full GC:有的说与Major GC差不多,有的说相当于执行minor+major回收,那么我们暂且可以认为Full GC就是全面的垃圾回收吧。

堆外内存?

堆外内存,其实就是不受JVM控制的内存。相比于堆内内存有几个优势:

1 减少了垃圾回收的工作,因为垃圾回收会暂停其他的工作(可能使用多线程或者时间片的方式,根本感觉不到)

2 加快了复制的速度。因为堆内在flush到远程时,会先复制到直接内存(非堆内存),然后在发送;而堆外内存相当于省略掉了这个工作。

而福之祸所依,自然也有不好的一面:

1 堆外内存难以控制,如果内存泄漏,那么很难排查

2 堆外内存相对来说,不适合存储很复杂的对象。一般简单的对象或者扁平化的比较适合。

堆外内存可以通过java.nio的ByteBuffer来创建,调用allocateDirect方法申请即可。参考API地址

至于怎么用,读读API文档就知道啦~

另外,默认的情况下堆外内存是有一定的限制的,好像是64M吧....

可以通过设置-XX:MaxDirectMemorySize=10M控制堆外内存的大小:

堆外内存的垃圾回收

堆外内存,既然可以无限使用,那么会不会用爆内存呢?这个是很有可能的...所以堆外内存的垃圾回收也很重要。

由于堆外内存并不直接控制于JVM,因此只能等到full GC的时候才能垃圾回收!

Full GC,一般发生在年老代垃圾回收以及调用System.gc的时候,这样肯定不能满足我们的需求!况且很多线上环境的JVM参数有-XX:+DisableExplicitGC,导致了System.gc()等于一个空函数,根本不会触发FGC,这一点在使用Netty框架时需要注意是否会出问题。

于是度娘帮助解决了这个问题,网上有朋友十分聪明的利用内部实现接口,反向获取到了一个clear方法!

package xing.test;

import java.nio.ByteBuffer;

import sun.nio.ch.DirectBuffer;

public class NonHeapTest {

public static void clean(final ByteBuffer byteBuffer) {

if (byteBuffer.isDirect()) {

((DirectBuffer)byteBuffer).cleaner().clean();

}

}

public static void sleep(long i) {

try {

Thread.sleep(i);

}catch(Exception e) {

/*skip*/

}

}

public static void main(String []args) throws Exception {

ByteBuffer buffer = ByteBuffer.allocateDirect(1024 * 1024 * 200);

System.out.println("start");

sleep(5000);

clean(buffer);//执行垃圾回收

// System.gc();//执行Full gc进行垃圾回收

System.out.println("end");

sleep(5000);

}

}

这样就能手动的控制回收堆外内存了!其中sun.nio其实是java.nio的内部实现。所以你可能不能通过eclipse的自动排错找到这个包,直接复制

import sun.nio.ch.DirectBuffer;

就行。

由于本文整理与网络各种资料,有些不对的地方还请指正,共同探讨!

java保证一段代码枷锁_Java堆外内存之突破JVM枷锁相关推荐

  1. java nio 堆外内存_Java堆外内存之突破JVM枷锁

    对于有Java开发经验的朋友都知道,Java中不需要手动的申请和释放内存,JVM会自动进行垃圾回收:而使用的内存是由JVM控制的. 那么,什么时机会进行垃圾回收,如何避免过度频繁的垃圾回收?如果JVM ...

  2. java 堆外内存 查看_JAVA堆外内存排查小结

    简介JVM堆外内存难排查但经常会出现问题,这可能是目前最全的JVM堆外内存排查思路. 通过本文,你应该了解:pmap 命令 gdb 命令 perf 命令 内存 RSS.VSZ的区别 java NMT ...

  3. java 查看堆外内存占用_Java堆外内存排查小结

    简介 JVM堆外内存难排查但经常会出现问题,这可能是目前最全的JVM堆外内存排查思路. 通过本文,你应该了解: pmap 命令 gdb 命令 perf 命令 内存 RSS.VSZ的区别 java NM ...

  4. java9 堆外内存_java堆外内存泄漏排查

    当考虑Java中的内存泄漏时,我们通常会考虑Java堆泄漏,即在堆中分配的对象没有被垃圾收集.这是我在处理一台服务器内存泄漏时的想法,但我即将经历的远超出我的想象. 症状:运行Vertx应用程序(没有 ...

  5. NIO详解(六):Java堆外内存

    1. 前言 最近研究ByteBuffer和DirectByteBuffer.堆外内存是相对于堆内内存的一个概念.堆内内存是由JVM所管控的Java进程内存,我们平时在Java中创建的对象都处于堆内内存 ...

  6. java nio 李林峰_Netty堆外内存泄漏排查,这一篇全讲清楚了

    上篇文章介绍了Netty内存模型原理,由于Netty在使用不当会导致堆外内存泄漏,网上关于这方面的资料比较少,所以写下这篇文章,专门介绍排查Netty堆外内存相关的知识点,诊断工具,以及排查思路提供参 ...

  7. java堆外内存详解(又名直接内存)和ByteBuffer

    堆内内存 java的内存分为堆内内存和堆外内存,在了解堆外内存之前,先看看堆内内存是啥,堆内内存是受jvm管控的,也就是说,堆内内存由jvm负责创建和回收:创建和回收都是自动进行的,不需要人为干预: ...

  8. Java堆外内存:堆外内存溢出问题排查

    一.堆外内存组成 通常JVM的参数我们会配置 -Xms 堆初始内存  -Xmx 堆最大内存  -XX:+UseG1GC/CMS 垃圾回收器  -XX:+DisableExplicitGC 禁止显示GC ...

  9. java堆外内存6_Java 堆外内存的使用

    更多 Java 虚拟机方面的文章,请参见文集<Java 虚拟机> 为什么需要使用堆外内存 将长期存活的对象(如 Local Cache )移入堆外内存( off-heap,又名直接内存 d ...

最新文章

  1. 赠书 | 读懂生成对抗神经网络 GAN,看这文就够了
  2. matlab双纵坐标的绘图命令_MATLAB基础学习之绘图基本命令
  3. jquery.min.js一引入到工程中显示红叉,或其他.js文件显示红叉
  4. linux禁止客户端上传文件_Linux下Shell脚本实现FTP自动上传和下载文件
  5. 什么?船开上高架了!
  6. 男性玩家占78.8%、90后玩家占近50%、最多人选择中国风链游……《2019链游玩家需求调研报告》重磅发布!...
  7. python request 接口自动化设计
  8. uni-app 实现自定义音效播放
  9. c语言无符号数最大值和最小值,c语言 int最大值是多少?
  10. 渥太华大学计算机科学COOP,加拿大研究生:授课型和研究型
  11. 软件测试人员需不需要懂代码
  12. 唐巧iOS博客好文列表
  13. PC客户端中的网页----问题集合(未完待续)
  14. 股权转让项目:沈阳派尔化学有限公司55%股权转让
  15. 心情手札——光头日记
  16. AE Saber插件画奥特曼
  17. mysql安装时的英文_安装MySQL遇到的常见英文翻译
  18. 60903鱼植共生缸
  19. 为什么大家都想进入IT行业?IT行业到底好不好?
  20. 2022 前端常用的开发工具、组件库等等~持续整理,待你分享~

热门文章

  1. 全球定位系统和惯性系统在高速公路上的高精密定位
  2. 问题 B: 第N个智慧数
  3. 03 - 大学生如何使用GPT
  4. 想转行网络安全行业,究竟是参加培训班还是靠自学?
  5. Vue的生命周期过程详解
  6. 零代码制作客制化87键机械键盘
  7. URL must not be null
  8. Robust semantic segmentation by dense fusion network on blurred vhr remote sensing images
  9. Panoply:一款netCDF, HDF and GRIB数据查看器
  10. 不自律的人,如何把一件事做成功?