type
status
date
slug
summary
tags
category
icon
password
这里写文章的前言:
一个简单的开头,简述这篇文章讨论的问题、目标、人物、背景是什么?并简述你给出的答案。
可以说说你的故事:阻碍、努力、结果成果,意外与转折。
📝 直接内存
操作系统的本地内存,就是真正的内存.而不是像JVM虚拟化的内存
优点: 更快,因为不像JVM堆、栈内存,需要先虚拟化一层,再做操作.直接内存是直接使用的.
缺点:需要人工释放
使用案例
1. Java可以通过Unsafe类去操作本地内存

- Netty、ByteBuffer底层操作系统mallcoc函数

- JNI (native本地方法)
- JNA,本质就是对JNI的包装
为什么使用直接内存
优点
1. 减少垃圾回收次数, 不会STW;减少内存碎片化,提高内存利用率
2. 加快操作速度, 减少了堆与直接内存的复制环节,直接省略了这一环节
3. 多个JVM的话,共享很麻烦, 但是直接内存共享更简单.
4. 不受制于虚拟化的控制,比如搞个1TB内存,堆可能根本不够.直接内存直接加就可以了
缺点
1. 不受JVM控制,需要自己手动释放如果忘记了,会发生内存泄露,而且是直接内存泄露,
2. 不好排查问题.因为直接内存和内核关联大,和JVM没什么关联,用JVM的分析工具没什么用
3. 不适合存储复杂对象,复杂对象有引用,操作引用就可以了.
一些相关工具
- MemoryMappedByteBuffer:Java NIO库中的类,可以将直接内存映射到文件中,实现高效的文件读写操作。
- JMH(Java Microbenchmark Harness):用于进行Java性能测试和微基准测试的工具,可以用于评估直接内存在特定场景下的性能优势。
- JProfiler、VisualVM等性能分析工具:用于分析应用程序的内存使用情况,可以帮助发现直接内存的使用情况和性能问题。
监控和排查
- JVM工具:JVM提供了一些内置工具可以用于监控直接内存的使用情况,如jstat、jmap、jcmd等。这些工具可以查看直接内存的分配量、使用量、释放量等统计信息,帮助了解直接内存的使用情况和趋势。
- 操作系统工具:操作系统的工具可以提供直接内存的监控和排查功能。例如,在Linux上可以使用命令行工具
top
、htop
、pmap
等来查看进程的内存使用情况,包括直接内存的使用量。
- 第三方工具:一些第三方工具和监控系统专门用于监控Java应用程序的性能和资源使用情况,其中也包括直接内存的监控。例如,Java性能分析工具(如VisualVM、JProfiler、YourKit等)可以提供直接内存的监控和分析功能,帮助定位直接内存使用过多或泄漏的问题。
- 日志和诊断信息:通过在应用程序中添加适当的日志和诊断信息,可以追踪和记录直接内存的分配和释放情况。这样可以在出现问题时,通过日志和诊断信息进行排查,定位直接内存相关的异常情况
- 阿里开源的Arthas可以通过
jvm.directMemory
命令来监控直接内存的使用情况。使用该命令,你可以查看直接内存的分配量、使用量和剩余量等信息
🤗 总结归纳
总结文章的内容
📎 参考文章
- 一些引用
- 引用文章
有关文章的问题,欢迎您在底部评论区留言,一起交流~