Java 堆外内存

news2024/11/20 20:25:06

文章目录

  • Java 堆外内存
    • 堆外内存的分配方式
      • 使用 Unsafe 类进行分配
      • 使用 ByteBuffer 进行分配
    • 堆外内存的查看方式

Java 堆外内存

在 Java 虚拟机中,分配对象基本上都是在堆上进行的,然而在有些情况下,缓存的数据量非常大时,使用磁盘或者分布式缓存就会比较合适,这时堆外缓存就是一个比较合适的选择。一般会认为 Java 进程启动后,除了分配的堆(heap)内存之外的内存都为堆外内存。堆外内存在没有引用时,也会被 Java 垃圾收集器进行回收。

在这里插入图片描述

如上图所示,堆外内存就是 Heap Out Memory 部分,在 Java 虚拟机中由 DirectByteBuffer 对象表示。

堆外内存的分配方式

Java 分配堆外内存的方式有两种方式,一种使用Unsafe类来进行分配,另一种使用ByteBuffer来进行分配。

使用 Unsafe 类进行分配

需要注意的是,使用 Unsafe 来进行分配,不受 -XX:MaxDirectMemorySize 参数的限制。

private static final long SIZE = 40 * 1024 * 1024;

/**
 * 获取 Unsafe 实例,通过反射的方式来获取,避免触发 SecurityException
 *
 * 通过反射的方式,堆外内存不受 -XX:MaxDirectMemorySize 参数限制
 */
private static Unsafe getUnsafeInstance() {
    try {
        Class<?> unsafeClass = Class.forName("sun.misc.Unsafe");
        Field field = unsafeClass.getDeclaredField("theUnsafe");
        field.setAccessible(true);
        Unsafe unsafe = (Unsafe) field.get(null);
        return unsafe;
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
}

/**
 * 分配堆外内存方式 1
 */
private static void allocateOffHeapMemory1() {
    Unsafe unsafe = getUnsafeInstance();
    // 分配内存
    long address = unsafe.allocateMemory(SIZE);

    // 重新分配内存,把数据从
    // unsafe.reallocateMemory(address, SIZE);

    // 释放内存
    // unsafe.freeMemory(address);
}

使用 ByteBuffer 进行分配

private static final long SIZE = 40 * 1024 * 1024;

/**
 * 分配堆外内存方式 2
 *
 * 受 -XX:MaxDirectMemorySize 参数限制
 */
private static void allocateOffHeapMemory2() {
    ByteBuffer buffer = ByteBuffer.allocateDirect((int) SIZE);
    // ...
}

堆外内存的查看方式

想要查看一个 Java 进程的堆外内存的信息,可以通过如下命令来启动该 Java 进程。

java -XX:+DisableExplicitGC -XX:MaxDirectMemorySize=40M -XX:NativeMemoryTracking=summary -Xms300M -Xmx300M -classpath [your class]
  • -XX:+DisableExplicitGC:用来显示禁止垃圾收集器回收。
  • -XX:MaxDirectMemorySize=40M:设置直接内存大小为 40M,如果使用 ByteBuffer 来执行分配时,超过 40M 会抛出 OOM 异常。
  • -XX:NativeMemoryTracking=summary:配置查看堆外内存的跟踪。
  • -Xms300M -Xmx300M:将堆内存限定在 300M。

当你的 Java 进程运行起来之后,可以通过下面的命令来查看虚拟机中内存的实际分配。

其中 reserved 表示应用可以使用的内存大小,committed 表示正在使用的内存大小。

# 通过 jps 找出对应进程的 pid
jps

# 使用 jcmd 查看汇总信息
jcmd [your process pid] VM.native_memory summary scale=MB

# 输出
Native Memory Tracking:

Total: reserved=1746MB, committed=478MB
-                 Java Heap (reserved=300MB, committed=300MB)
                            (mmap: reserved=300MB, committed=300MB) 
 
-                     Class (reserved=1046MB, committed=19MB)
                            (classes #470)
                            (malloc=14MB #179) 
                            (mmap: reserved=1032MB, committed=5MB) 
 
-                    Thread (reserved=33MB, committed=33MB)
                            (thread #34)
                            (stack: reserved=33MB, committed=33MB)
 
-                      Code (reserved=244MB, committed=3MB)
                            (mmap: reserved=244MB, committed=3MB) 
 
-                        GC (reserved=27MB, committed=27MB)
                            (malloc=16MB #144) 
                            (mmap: reserved=11MB, committed=11MB) 
 
-                  Internal (reserved=54MB, committed=54MB)
                            (malloc=54MB #1678) 
 
-                    Symbol (reserved=1MB, committed=1MB)
                            (malloc=1MB #98) 
                            (arena=1MB #1)
  • Java Heep:可以观察到堆(heap)内内存限定在 300M。
  • Class:表示已经加载 class 数量以及占用的内存。
  • Thread:表示目前有多少个线程以及占用的内存。
  • Code:表示编译器生成代码所占用的内存。
  • GC:表示垃圾回收器需要使用多少内存来完成垃圾回收动作。
  • Internal: 包含命令行解析器使用的内存、JVMTI、PerfData 以及 Unsafe 分配的内存等等,可以观察到上述代码分配的 40M 堆外内存包含此处的 54M 内。
    • JVMTI(JVM Tool Interface):是开发和监视 Java 虚拟机的编程接口。
    • PerfData:是 Java 虚拟机中用来记录一些指标数据的文件。
  • Symbol:表示字符串表、常量池等所占用的内存。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/428248.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Python_Scrapy学习笔记(十四)】基于Scrapy框架的文件管道实现文件抓取(基于Scrapy框架实现多级页面的抓取)

基于Scrapy框架的文件管道实现文件抓取(基于Scrapy框架实现多级页面的抓取) 前言 本文中介绍 如何基于 Scrapy 框架的文件管道实现文件抓取(基于Scrapy框架实现多级页面的抓取)&#xff0c;并以抓取 第一PPT 网站的 PPT 模板为例进行展示&#xff0c;同时抓取此网站数据的方式…

Docker安装Nexus搭建Maven私服及介绍

目录前言一、Nexus是什么&#xff1f;二、Docker安装方式1. 拉取镜像2. 创建挂载目录3. 运行4. 容器运行日志 &#xff08;可选&#xff09;三、用户登录四、仓库介绍五、创建代理仓库六、上传依赖&#xff08;重点&#xff09;七、下载依赖常见问题1、如何把新建的仓库添加到组…

【前端之旅】vue-router声明式导航和编程式导航

一名软件工程专业学生的前端之旅,记录自己对三件套(HTML、CSS、JavaScript)、Jquery、Ajax、Axios、Bootstrap、Node.js、Vue、小程序开发(Uniapp)以及各种UI组件库、前端框架的学习。 【前端之旅】Web基础与开发工具 【前端之旅】手把手教你安装VS Code并附上超实用插件…

科研作图-常用的图像分割指标 (Dice, Iou, Hausdorff) 及其计算

1. 简介 本节内容主要是介绍图像分割中常用指标的定义、公式和代码。常用的指标有Dice、Jaccard、Hausdorff Distance、IOU以及科研作图-Accuracy,F1,Precision,Sensitive中已经介绍的像素准确率等指标。在每个指标介绍时&#xff0c;会使用编写相关代码&#xff0c;以及使用M…

TypeScript学习记录Ts基础

安装及初步使用 1.CMD全局安装 npm install -g typescript2.检查是否安装成功 tsc -V 如报错tsc 不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件[可参考](https://www.cnblogs.com/sanyekui/p/13157918.html)3.在vscode中新建ts文件01_ts.ts let str:strin…

iPhone上5款视频压缩工具推荐,学会轻松压缩视频

随着技术的不断进步&#xff0c;现在移动端设备已经能够轻松地拍摄高清视频&#xff0c;然而这也带来了存储压力的增大。苹果手机更新换代频繁&#xff0c;但内存空间却没有跟着变大&#xff0c;因此如何压缩视频成为了一个重要的问题。 苹果手机怎么压缩视频&#xff1f;有什…

01-ASPICE体系知识

1. ASPICE是什么&#xff1f; ASPICE: 全称是"Automotive Software Process Improvement and Capacity Determination"&#xff0c;汽车软件过程改进及能力评定&#xff0c;是汽车行业用于评价软件开发团队的研发能力水平的模型框架。最初由欧洲20多家主要汽车制造商…

上位机:创建WPF应用并使用控件完成控件交互

创建WPF应用并使用控件完成控件交互 1.XAML是WPF技术中专门用于设计UI的语言。 2.优点,XAML是一种声明型语言,只能用来声明一些UI元素、绘制UI和动画,不能在其中加入程序逻辑。实现UI与逻辑的剥离。 下面使用visual studio2019建立一个WPF项目: 进入项目,点击运行,然后…

FluxMQ—引领物联网新时代的高性能MQTT网关

FluxMQ—引领物联网新时代的高性能MQTT网关 随着物联网技术的快速发展&#xff0c;人们越来越意识到实时、可靠、安全的数据传输对于智能化的生产与生活的重要性。因此&#xff0c;市场对于高性能的物联网数据传输解决方案有着强烈的需求。FluxMQ正是为满足这一需求而诞生的一…

苹果电脑怎么用移动硬盘ntfs 苹果电脑移动硬盘怎么退出

Mac电脑默认不支持写入NTFS格式移动硬盘&#xff0c;这导致很多Mac用户的工作过程遇到很多不必要的麻烦。如何才能让Mac电脑“永久”拥有写入NTFS格式移动硬盘的权限呢&#xff1f;不少用户使用完移动硬盘后直接拔出&#xff0c;这可能会导致未保存的文件丢失。使用完移动硬盘后…

城市供水绩效指标解释

1.城市供水绩效评价指标体系构成 1.1.1绩效指标体系横向构成包括&#xff1a; 背景信息&#xff1a;用于计算指标的数据。 解释性因素&#xff1a;靠管理不易改变的数据。 绩效指标&#xff1a;若干个基础数据的综合运算结果&#xff0c;用于评价所提供服务的有效性…

Python每日一练(20230418)

目录 1. 将有序数组转换为二叉搜索树 &#x1f31f;&#x1f31f; 2. 四数之和 &#x1f31f;&#x1f31f; 3. 排序数组查找元素的首末位置 &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C…

JAVA基于局域网的聊天室系统的设计与实现

本文介绍了采用JAVA编程开发视频聊天系统的一套比较常用的解决方案。文字聊天采用TCP模式&#xff1b;语音视频聊天采用UDP模式&#xff0c;在客户端之间点对点的进行。在该方案中&#xff0c;通过函数库VFW来实现视频捕获、影像压缩以及影像播放。微软公司提供的专门用于视频捕…

Python入门教程+项目实战-10.2节: 列表的操作符

目录 10.2.1 列表中的常用操作符 10.2.2 []操作符: 索引访问列表 10.2.3 [:]操作符&#xff1a;列表的切片 10.2.4 操作符&#xff1a;列表的加法 10.2.5 *操作符&#xff1a;列表的乘法 10.2.6 列表的关系运算 10.2.7 in操作符&#xff1a;查找元素 10.2.8 知识要点 …

香港电讯牌照申请介绍

香港对无线电发射器具的进出口实施法律管制&#xff0e;《电讯条例》规定进出口手提电话的人士须持有许可证或无线电商牌照。例如&#xff1a;手机、3C类产品、手提电脑等无线电子产品&#xff0c;通关时须要出示的证件之一。 一、香港电讯牌照申请需提供资料&#xff1a;1、有…

py逆向-NSSCTF-[NISACTF 2022]ezpython

目录 题目&#xff1a; 学到的点&#xff1a; 题目&#xff1a; 之前没遇到过这样的题&#xff0c;看了大佬的wp了解很多&#xff0c;记录一下 放到ida中打开&#xff0c;尝试分析了一下&#xff0c;没头绪 看了题解知道是一道py逆向的题目&#xff0c;需要用到这个工具pyin…

Elasticsearch+filefeat+Kibana(EFK)架构学习

一. 安装ES7集群 准备三台服&#xff0c;最少配置2core4G,磁盘空间最少20G,并关闭防火墙设置集群免密登录&#xff0c;方便scp文件等操作参考集群免密登录方法下载es7的elasticsearch-7.17.3-x86_64.rpm包安装 yum -y localinstal elasticsearch-7.17.3-x86_64.rpm修改node1配…

【SpringMVC】SpringMVC(一:第一个SpringMVC项目)

文章目录1. SSM优化的方向2.SpringMVC的优点3. SpringMVC的优化方向4.SpringMVC执行流程5.第一个SpringMVC项目5.1 创建工程5.2 添加依赖5.3 替换web.xml5.4 开发流程5.4.1完成springmvc.xml文件的配置5.4.2在web.xml文件中注册SpringMVC框架。5.4.3 编写控制器5.4.4 开发页面&…

【Spring Boot】SpringBoot参数验证以及实现原理

文章目录前言SpringBoot参数验证技巧&#xff08;12个技巧&#xff09;一、使用验证注解二、使用自定义验证注解三、在服务器端验证四、提供有意义的错误信息五、将 i18n 用于错误消息六、使用分组验证七、对复杂逻辑使用跨域验证八、对验证错误使用异常处理九、测试你的验证逻…

天啊!炫云的这个智能优化太给力了,渲染费竟然降了这么多!

兄弟们&#xff0c;你们是不是有时候一不小心把自己某一个参数设置错了&#xff0c;导致自己提交到云渲染平台的效果图费用突然增多&#xff0c;找平台理论最后发现是自己参数设置错误导致的问题&#xff0c;又或者对自己的参数设置把握不准的&#xff1f;现在这些问题你都可以…