java堆外内存
文章平均质量分 89
weixin_42073629
这个作者很懒,什么都没留下…
展开
-
GC 日志打印实践
1.1 -XX:+PrintGC与-verbose:gc如果只设置-XX:+PrintGC那么打印的日志如下所示:[GC (Allocation Failure) 61805K->9849K(256000K), 0.0041139 secs]1、GC类型,GC:minor GC(young gc),Full GC:major GC2、Allocation Failure 表示是失败的类型3、68896K->5080K 表示年轻代从68896K降为5080K4、2560原创 2021-06-03 01:22:49 · 1046 阅读 · 0 评论 -
深入剖析JVM堆外内存的监控与回收
引子记得那是一个风和日丽的周末,太阳红彤彤,花儿五颜六色,96 年的普哥微信找到我,描述了一个诡异的线上问题:线上程序使用了 NIO FileChannel 的 堆内内存作为缓冲区,读写文件,逻辑可以说相当简单,但根据监控却发现堆外内存飙升,导致了 OutOfMemeory 的异常。由这个线上问题,引出了这篇文章的主题,主要包括:FileChannel 源码分析,堆外内存监控,堆外内存回收。问题分析&源码分析根据异常日志的定位,发现的确使用的是 HeapByteBuffer 来...原创 2021-03-28 22:34:34 · 715 阅读 · 0 评论 -
Netty堆外内存泄露排查与总结
导读Netty 是一个异步事件驱动的网络通信层框架,用于快速开发高可用高性能的服务端网络框架与客户端程序,它极大地简化了 TCP 和 UDP 套接字服务器等网络编程。Netty 底层基于 JDK 的 NIO,我们为什么不直接基于 JDK 的 NIO 或者其他NIO框架: 使用 JDK 自带的 NIO 需要了解太多的概念,编程复杂。 Netty 底层 IO 模型随意切换,而这一切只需要做微小的改动。 Netty自带的拆包解包,异常检测等机制让我们从 NIO 的繁重细节中脱离出原创 2021-03-04 19:20:30 · 386 阅读 · 1 评论 -
SystemGC完全解读
概述JVM的GC一般情况下是JVM本身根据一定的条件触发的,不过我们还是可以做一些人为的触发,比如通过jvmti做强制GC,通过System.gc触发,还可以通过jmap来触发等,针对每个场景其实我们都可以写篇文章来做一个介绍,本文重点介绍下System.gc的原理或许大家已经知道如下相关的知识system.gc其实是做一次full gc system.gc会暂停整个进程 system.gc一般情况下我们要禁掉,使用-XX:+DisableExplicitGC system.gc在cms原创 2021-06-07 00:42:24 · 1134 阅读 · 0 评论 -
Java堆外内存之六:堆外内存溢出问题排查
一、堆外内存组成通常JVM的参数我们会配置-Xms 堆初始内存-Xmx 堆最大内存-XX:+UseG1GC/CMS 垃圾回收器-XX:+DisableExplicitGC 禁止显示GC-XX:MaxDirectMemorySize 设置最大堆外内存,默认是-xmx-survivor,也就是基本上和-xmx大小相等-Xss:每个线程的堆栈大小,默认1M-Xmn: 年轻代大小(eden区+2 survivor)-XX:newRatio: 4 年轻代与老年代1:4-XX:survivor原创 2021-06-07 00:28:46 · 1587 阅读 · 0 评论 -
Java堆外内存之五:堆外内存使用总结
一、对外内存的操作《堆外内存操作类ByteBuffer》《DirectBuffer》《Unsafe(java可直接操作内存(),挂起与恢复,CAS操作)》 有时候对内存进行大对象的读写,会引起JVM长时间的停顿,有时候则是希望最大程度地提高JVM的效率,我们需要自己来管理内存(看起来很像是Java像C++祖宗的妥协吧)。据我所知,很多缓存框架都会使用它,比如我以前使用过的EhCache(给它包装了个酷一点的名字,叫BigMemory),以及现在项目中的Memcached等。使用堆外内存原创 2021-06-06 13:08:45 · 1416 阅读 · 0 评论 -
Java堆外内存之四:堆外内存管理类ByteBuffer
本篇主要讲解如何使用直接内存(堆外内存),并按照下面的步骤进行说明:相关背景-->读写操作-->关键属性-->读写实践-->扩展-->参考说明希望对想使用直接内存的朋友,提供点快捷的参考。数据类型下面这些,都是在使用DirectBuffer中必备的一些常识,暂作了解吧!基本类型长度在Java中有很多的基本类型,比如:byte,一个字节是8位bit,也就是1B short,16位bit,也就是2B int,32位bit,也就是4B long,原创 2021-06-06 13:02:13 · 476 阅读 · 0 评论 -
Java堆外内存之三:直接使用Unsafe类操作堆外内存
在nio以前,是没有光明正大的做法的,有一个work around的办法是直接访问Unsafe类。如果你使用Eclipse,默认是不允许访问sun.misc下面的类的,你需要稍微修改一下,给Type Access Rules里面添加一条所有类都可以访问的规则:在使用Unsafe类的时候:Unsafe f = Unsafe.getUnsafe();发现还是被拒绝了,抛出异常:java.lang.SecurityException: Unsafe正如Unsafe的类注释中写道:Al原创 2021-06-06 12:42:35 · 388 阅读 · 0 评论 -
Java堆外内存之二:堆外内存回收方法
一、JVM内存的分配及垃圾回收 对于JVM的内存规则,应该是老生常谈的东西了,这里我就简单的说下: 新生代:一般来说新创建的对象都分配在这里。 年老代:经过几次垃圾回收,新生代的对象就会放在年老代里面。年老代中的对象保存的时间更久。 永久代:这里面存放的是class相关的信息,一般是不会进行垃圾回收的。JVM垃圾回收 由于JVM会替我们执行垃圾回收,因此开发者根本不需要关心对象的释放。但是如果不了解其中的原委,很容易内存泄漏,只能两眼望天了! 垃圾回收,大致可以分为下原创 2021-06-06 01:07:34 · 1279 阅读 · 0 评论 -
Java堆外内存之一:堆外内存场景介绍(对象池VS堆外内存)
最近经常有人问我在Java中使用堆外(off heap)内存的好处与用途何在。我想其他面临几样选择的人应该也会对这个答案感兴趣吧。堆外内存其实并无特别之处。线程栈,应用程序代码,NIO缓存用的都是堆外内存。事实上在C或者C++中,你只能使用未托管内存,因为它们默认是没有托管堆(managed heap)的。在Java中使用托管内存或者“堆”内存是这门语言的一个特性。注意:Java并非唯一这么做的语言。new Object() vs 对象池 vs 堆外内存1、new Object()在Java原创 2021-06-06 00:44:31 · 719 阅读 · 0 评论
分享