JVM工作原理与实战(二十):直接内存

专栏导航

JVM工作原理与实战

RabbitMQ入门指南

从零开始了解大数据


目录

专栏导航

前言

一、直接内存

1.直接内存作用

二、在直接内存上创建数据

总结


前言

JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了直接内存、在直接内存上创建数据等内容。


一、直接内存

在探讨直接内存之前,首先需要理解Java虚拟机(JVM)的运行时数据区。在《Java虚拟机规范》中,定义了几个关键的内存区域,如堆、方法区、程序计数器、Java虚拟机栈和本地方法栈。但直接内存,这一概念并不直接包含在《Java虚拟机规范》中。实际上,直接内存更多地是Java内存管理中的一个高级特性。

运行时数据区:

 运行时数据区的详细讲解可以查看之前的文章:

JVM工作原理与实战(十五):运行时数据区-程序计数器-CSDN博客文章浏览阅读1.9k次,点赞52次,收藏35次。JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了运行时数据区、程序计数器等内容。 ​https://blog.csdn.net/jiangyq_/article/details/135578434JVM工作原理与实战(十六):运行时数据区-Java虚拟机栈-CSDN博客文章浏览阅读1.1k次,点赞24次,收藏23次。JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了运行时数据区、Java虚拟机栈等内容。 ​https://blog.csdn.net/jiangyq_/article/details/135587510JVM工作原理与实战(十七):运行时数据区-栈内存溢出-CSDN博客文章浏览阅读1.1k次,点赞37次,收藏13次。​JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了栈内存溢出、设置虚拟机栈的大小等内容。 ​https://blog.csdn.net/jiangyq_/article/details/135622580JVM工作原理与实战(十八):运行时数据区-堆-CSDN博客文章浏览阅读965次,点赞31次,收藏5次。​JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了运行时数据区、堆介绍、堆的关键参数等内容。https://blog.csdn.net/jiangyq_/article/details/135643531JVM工作原理与实战(十九):运行时数据区-方法区-CSDN博客文章浏览阅读535次,点赞12次,收藏10次。JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了方法区、方法区在Java虚拟机的实现、类的元信息、运行时常量池、字符串常量池、静态变量的存储等内容。https://blog.csdn.net/jiangyq_/article/details/135675559

1.直接内存作用

直接内存(Direct Memory)的引入与JDK 1.4中的新IO(NIO)机制紧密相关。NIO为Java提供了非阻塞的I/O操作,从而允许更高的并发性和更高效的I/O处理。而直接内存正是NIO实现的关键部分:

  • 解决对象回收问题:在Java中,当堆上的对象不再被引用时,这些对象将被标记为可回收。这个过程可能会影响正在运行的应用程序,因为垃圾回收器可能需要停止或阻塞应用程序线程以完成其工作。直接内存通过减少堆上的对象数量来减轻这种影响。通过将数据直接存储在直接内存中,应用程序可以持续运行,而不必担心垃圾回收器可能带来的暂停或阻塞。
  • 减少数据复制开销:传统的IO操作,如读取文件,通常涉及两个步骤:首先将数据从文件读入到缓冲区(通常是直接内存),然后再从缓冲区复制到Java堆上的对象。这种双重数据复制不仅增加了延迟,还增加了CPU和内存的使用。通过使用直接内存作为缓冲区,NIO可以直接在直接内存中处理数据,从而减少了数据从缓冲区到堆的复制过程,提高了IO操作的效率。

直接内存的出现不仅提高了Java应用程序的性能,而且也增加了应用程序对并发和大数据处理的适应能力。通过使用直接内存,应用程序可以更有效地管理其资源,同时提高其响应速度和吞吐量。

二、在直接内存上创建数据

Java NIO提供了一种机制,允许在直接内存上创建数据。要实现这一目标,可以使用ByteBuffer的allocateDirect方法,size参数表示希望分配的直接内存的大小,单位为字节。

    ByteBuffer directBuffer = ByteBuffer.allocateDirect(size);

查看Java虚拟机的直接内存大小,可以使用arthas的memory命令,通过在命令行中输入memory来查看输出中的"direct"属性。

特殊情况下,可能需要手动调整直接内存的大小。可以通过设置JVM参数-XX:MaxDirectMemorySize来实现,这个参数允许开发者指定直接内存的最大大小。在设置-XX:MaxDirectMemorySize参数时,可以使用k或K表示千字节,m或M表示兆字节,g或G表示千兆字节,如果不设置这个参数,JVM会自动选择最大的分配大小。

案例:

public class Demo1 {public static int size = 1024 * 1024 * 100;public static List<ByteBuffer> list = new ArrayList<ByteBuffer>();public static int count = 0;public static void main(String[] args) throws IOException, InterruptedException {System.in.read();while (true) {ByteBuffer directBuffer = ByteBuffer.allocateDirect(size);list.add(directBuffer);System.out.println(++count);}}
}

运行结果:

设置直接内存的大小:

-XX:MaxDirectMemorySize=1g

运行结果:


总结

JVM是Java程序的运行环境,负责字节码解释、内存管理、安全保障、多线程支持、性能监控和跨平台运行。本文主要介绍了直接内存、在直接内存上创建数据等内容,希望对大家有所帮助。

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

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

相关文章

Spring Cloud详细入门使用

文章目录 Spring Cloud服务注册与发现EurekaServer 启动服务注册服务发现 NacosServer启动 (nacos2.2.0)服务注册服务发现服务集群命名空间配置中心集群搭建 负载均衡RPC远程过程调用Feign使用 网关路由断言工厂网关过滤工厂跨域处理全局跨域配置单个微服务跨域配置 限流 熔断 …

Codeforces Round 919 (Div. 2) A~E

A. Satisfying Constraints(模拟) 题意&#xff1a; 给出 n n n个限制条件&#xff0c;问有多少个数字 k k k同时满足这些限制条件。 限制条件分为以下三种&#xff1a; k k k必须大于等于给出的一些数字 x x x k k k必须小于等于给出的一些数字 x x x k k k不能与给出的…

Netty和传统NIO之间的比较

Netty回显服务器实现&#xff1a; import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelInitializer; import io.netty.channel.ChannelOption; import io.netty.channel.SimpleChannelInboundHandle…

十个Java字符串操作示例程序

1. 如何在String中获取不同的字符及其计数&#xff1f; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors;public class DistinctCharsCount {public static void main(String[] args) {printDistinctCharsWithCo…

定时器开发基础

1定时器的基本概述 通过滴漏和漏沙瓶这两个例子简单讲述定时器的基本工作原理。 STM32的常见的定时器资源&#xff1a; 系统嘀嗒定时器SysTick、看门狗定时器WatchDog、实时时钟RTC、基本定时器、通用定时器、高级定时器。 系统嘀嗒定时器SysTick &#xff1a;这是一个集成在C…

中移(苏州)软件技术有限公司面试问题与解答(2)—— Linux内核内存初始化的完整流程1

接前一篇文章&#xff1a;中移&#xff08;苏州&#xff09;软件技术有限公司面试问题与解答&#xff08;1&#xff09;—— 可信计算国密标准 本文参考以下文章&#xff1a; 启动期间的内存管理之初始化过程概述----Linux内存管理(九) Linux初始化 特此致谢&#xff01; 本…

JavaScript 自定义分页组件

仿boostrap 前端分页组件的实现 一 写一个前端自定义分页组件&#xff0c;需要考虑以下问题 需要一个<ul id"pagination"></ul>标签 total; // 总数据的数量 pageSize; // 一页显示数量 pageIndex; // 当前页 二 实现细节 编写html文件 index.html…

Debezium日常分享系列之:Debezium and TimescaleDB

Debezium日常分享系列之&#xff1a;Debezium and TimescaleDB 一、TimescaleDB二、完整案例三、Hypertables四、Continuous aggregates五、Compression六、结论 一、TimescaleDB TimescaleDB 是一个开源数据库&#xff0c;旨在使 SQL 对于时间序列数据具有可扩展性。它是作为…

代码随想录算法训练营第二十四天| 77. 组合

77. 组合 题目链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 解题思路&#xff1a;纵向遍历&#xff0c;遇到叶子节点返回上一节点 java&#xff1a; class Solution {List<List<Integer>> result new ArrayList&l…

ACL配置

ACL&#xff1a;访问控制列表 在路由器流量进或出接口上&#xff0c;匹配流量产生动作-- 允许 拒绝 &#xff08;访问限制&#xff09;定义感兴趣流量--- 匹配流量后&#xff0c;将流量提交给其他的协议进行策略 匹配规则&#xff1a; 至上而下逐一匹配&#xff0c;上条匹配…

蓝桥杯(C++ 整数删除 优先队列 )

优先队列&#xff1a; 优先队列具有队列的所有特性&#xff0c;包括队列的基本操作&#xff0c;只是在这基础上添加了内部的一个排序&#xff0c;它本质是一个堆实现的。 1.头文件&定义 #include <queue> #include <functional> //greater<>// 定义 p…

1d 卷积网络笔记

目录 这个是1d 卷积网络合集&#xff1a; resnet1d的 这个是1d 卷积网络合集&#xff1a; https://github.com/StChenHaoGitHub/1D-deeplearning-model-pytorch/blob/main/ResNet50.py resnet1d的 https://github.com/hsd1503/resnet1d

2023 年顶级前端工具

谁不喜欢一个好的前端工具&#xff1f;在本综述中&#xff0c;您将找到去年流行的有用的前端工具&#xff0c;它们将帮助您加快开发工作流程。让我们深入了解一下&#xff01; 在过去的 12 个月里&#xff0c;我在我的时事通讯 Web Tools Weekly 中分享了数百种工具。我为前端…

经典数据库练习题及答案

数据表介绍 --1.学生表 Student(SId,Sname,Sage,Ssex) --SId 学生编号,Sname 学生姓名,Sage 出生年月,Ssex 学生性别 --2.课程表 Course(CId,Cname,TId) --CId 课程编号,Cname 课程名称,TId 教师编号 --3.教师表 Teacher(TId,Tname) --TId 教师编号,Tname 教师姓名 --4.成绩…

JavaScript DOM可以做什么?

1、通过id获取标签元素 DOM是文档对象模型&#xff0c;它提供了一些属性和方法来方便我们操作document对象&#xff0c;比如getElementById()方法可以通过某个标签元素的id来获取这个标签元素 // 用法 window.document.getElementById(id); // 例子 <!DOCTYPE html> &l…

深度学习模型之yolov8实例分割模型TesorRT部署-python版本

1 模型转换 从github上下载官方yolov8版本&#xff0c;当前使用的版本是2023年9月份更新的版本&#xff0c;作者一直在更新。官网地址 2 加载模型 模型的训练和测试在官方文档上&#xff0c;有详细的说明&#xff0c;yolov8中文文档这里不做过多说明&#xff0c;v8现在训练是…

C#设计模式教程(5):建造者模式

建造者模式的定义 建造者模式(Builder Pattern)是一种创建型设计模式,它允许你创建复杂对象的步骤分离,这样你可以使用相同的创建过程生成不同的表示。建造者模式通常用于处理那些包含多个成员变量的类,特别是当这些成员变量需要经过复杂步骤构建或者有大量可选参数时。 …

一个查看各个软件版本生命周期的网站

在做开发或学习时&#xff0c;经常翻文档找各个SDK版本的支持信息&#xff0c;比较麻烦。发现一个罗列 JDK、SpringBoot、PHP等常见的应用的生命周期追踪网站&#xff1a;https://endoflife.date/。 endoflife.date 目前追踪 286 个产品。

智能驾驶新浪潮:SSD与UFS存储技术如何破浪前行?-UFS篇

如果说SSD是赛道上的超级跑车&#xff0c;那UFS更像是专为智能汽车定制的高性能轻量化赛车。UFS采用串行接口技术&#xff0c;像是闪电侠一样&#xff0c;将数据传输的速度推向新高&#xff0c;大幅缩短了系统启动时间和应用程序加载时间&#xff0c;这对追求即时反应的ADAS系统…