小研究 - Java虚拟机内存管理(四)

news2024/9/22 13:41:43

Java 语言的面向对象,平台无关,安全,开发效率高等特点,使其在许多领域中得到了越来越广泛的应用。但是由于Java程序由于自身的局限性,使其无法应用于实时领域。由于垃圾收集器运行时将中断Java程序的运行,其运行时刻和垃圾搜集时间具有不确定性。在应用程序高频率分配和释放内存时,垃圾收集要占用的时间可能比程序自身运行的时间还要多。这些都使得 Java程序无法满足在实时领域应用的要求。

Java实时规范(RTSJ)的内存管理机制既保证了Java本身的内存安全的优势,同时又保证了在实时系统中对内存操作的的可预测性。不产生垃圾的代码不会导致请求式的垃圾收集;不引用堆中对象的代码可以抢占垃圾收集器的线程。为了能够保留垃圾收集的好处又能避免垃圾收集器对实时特性的影响,基于以上两个事实RTSJ扩展了Java内存管理机制,在传统的堆内存的基础上,又提出了内存区域(Memory Area)的概念。在新增加的这几个内存区域中分配对象不会导致垃圾收集器的执行,不会使系统受到其不可预测性的影响。
本文根据RTSJ的要求,介绍了RTSJ内存管理机制实现的各个基本要点,包括使用Display树的内存引用检查, LTMemory和VTMemory的分配机制, ScopeStack的维护等。文章通过研究一个可运行在多种操作系统并兼容多种硬件平台的开源的Java虚拟机SableVM的基础上,结合国内外最新的理论,提出了一个对其实时性进行改进的方案,并对其进行实验。该方案有别于国内外现有的实时Java虚拟机的实现,在内存管理方面即符合RTSJ的要求,同时又保证了Java程序可移植性的要求。

目录

5  实验结果与分析

5.1 实现方法

5.2  实验结果与分析

5.2.1 固定分配内存实验

5.2.2 递增分配内存实验

5.2.3 总结


5  实验结果与分析

5.1 实现方法

本实现结合了开源的Java虚拟机SableVM和开源的RTSJ实现jRate两者的优点,使 SableVM 实现了 RTSJ 内存管理机制。实现包括2 个部分,实时 Java 类库和虚拟机本地接口实现。实时 Java 类库采用了 jRate 的实现,而在 SableVM 中只需将该实时 Java类库中的本地函数实现好,就能够将实时Java类库和虚拟机连接起来。如图5-1 所示。

5.2  实验结果与分析

对内存分配的实时性测试采用了2种方式,一种是采用每次固定分配固定大小的内存,如500KB,测试其分配时间,观察其每次分配时间的确定性;另一种是采用每次分配内存的大小不断递增,观察分配内存的大小和分配时间的关系。

这里的实时内存管理是软实时,要求内存分配的时间具有确定性,同时允许其在合理的范围内的波动。

为了使实验达到较高的精度,测量时间的方法是采用realtime类库中的HighResolutionClock 等类。这些类的本地方法实现中获取时间的方法是采用奔腾处理器所支持的RDTSC指令【38】,该指令直接访问时钟计数器,代码如下:

unsigned long long int rdtsc_;
    __asm__ __volatile__ ("rdtsc" : "=A" (rdtsc_) // Output
    );
    // Convert clock number into nano seconds
long double timeNS = rdtsc_ * CLOCK_PERIOD_NS;

该方法可以精确到纳秒,完全满足本实验的要求。

5.2.1 固定分配内存实验

固定分配内存的代码如下:

继承实时线程类:

public class MyRTThread extends RealtimeThread {
    public void run() {
        …
        TestLogic logic = new TestLogic();
        for (i=1; i<=10; ++i) { // 分配 10 次 , 取 10 次数据
            m_memArea.enter(logic); // 切换当前的分配上下文设为 m_memArea
        }
        …
    }
}

创建一个运行逻辑logic。运行逻辑就是一个继承于Runnable的类,他必须带有run()方法,可以说内存区域都是在运行逻辑中使用的:

class TestLogic implements Runnable {
    public void run() {
        …
        start = clock.getClockTickCount(); // 获取开始的精确时间
        data = new byte[size]; // 分配 size 大小的内存,
        end = clock.getClockTickCount();// 获取结束的精确时间
        usedTime = end - start;
        sout.println(size + "\t" + usedTime);
        …
    }
}

代码中,首先继承了实时线程RealtimeThread类,在run()方法中分10次,每次使用指定的内存区域分配大小为size的对象,使用高精度时钟计算分配对象的时间,然后打印出来。

实验中,指定size为500kB,内存区域大小为10MB,内存区域对象分别设为HeapMemory, LTMemory, CTMemory。实验结果,如图5-2到5-4所示。

 

图5-2、5-3、5-4 是采取每次分配固定大小内存(500KB)的情况。由实验结果可以看出,在每次分配内存大小相同的情况下,堆内存的分配时间受到垃圾收集器的影响很大,垃圾收集的时间是内存分配时间的10倍以上,而对于LTMemory和CTMemory它的分配时间波动比较小。

图5-5把这三种内存区域进行比较。相比之下,由于CTMemroy没有了对象初始化操作,其分配时间是LTMemory的1/20左右,正常情况下LTMemroy分配内存的时间与HeapMemory近似,因为它们采用的是类似的分配的算法。

5.2.2 递增分配内存实验

递增分配内存的实验代码如下所示。

继承实时线程类:

public class MyRTThread extends RealtimeThread {
    public void run() {
        …
        TestLogic logic = new TestLogic();

        sout = new PrintWriter(new BufferedOutputStream(System.out));
        int n=0, i=0;
        logic.size = 16;
        for (i=1; i<=10; ++i) {
            System.gc();
            logic.size = logic.size * 2;
            m_memArea.enter(logic);
        }
        sout.flush();
        …
    }
}

创建一个运行逻辑logic,对内存进行递增分配实验。

class TestLogic implements Runnable {
    public void run() {
        …
        start = clock.getClockTickCount();
        data = new byte[1];

        start = clock.getClockTickCount();
        start = clock.getClockTickCount();
        for (i =1; i<=100; ++i) {
            data = new byte[size];
        }
        end = clock.getClockTickCount();
        usedTime = end - start;
        sout.println(size + "\t" + usedTime);
        …
    }
}

代码中,首先继承了实时线程RealtimeThread类,在run()方法中分10次,每次使用指定的内存区域递增分配倍数为2的对象,使用高精度时钟计算分配对象的时间,然后打印出来。

实验中,指定分配大小从32B到16384B,内存区域大小为10MB,内存区域对象分别设为HeapMemory, LTMemory, CTMemory。实验结果如图5-6到5-9所示。

图5-6、5-7、5-8是采取递增式分配内存的情况。从递增式分配内存的测试结果可以看出,CTMemory的分配时间不随分配内存的大小而变化。HeapMemory和LTMemory的分配时间与分配内存的大小基本上成正比,在分配的内存比较小的时候分配时间随内存大小的变化不明显,这是因为对象的初始化时间占用的比例较小。

 图5-9 把这三种内存区域进行比较。表5-1 列出了一组对比数据。

从这些数据可以看出在内存分配大小较小时各内存区域的分配时间是基本相同的,而且变化不大。当内存分配大小较大时可以明显的看出分配时间的差别,尤其是HeapMemory 的性能下降很快。同时可以看到当分配的内存很大的时候 LTMemory 的分配时间比HeapMemory小得多。

5.2.3 总结

从实验结果可知,新增的 CTMemory 和 LTMemory 已经基本满足了 RTSJ 的要求,在这些内存区域中分配内存不会引起垃圾收集,从而保证了内存分配时间的确定性。同时CTMemory和LTMemory比HeapMemory拥有更高的性能。可以看到,本文设计的内存区域模型的已经可以满足一般实际应用中的实时性的要求。

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

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

相关文章

电机控制::控制技术与控制要求

功能要求性能要求基本FOC基础控制&#xff08;刚性调参&#xff09;稳、准、快系统性能优化先进控制方案&#xff1a; 精准建模惯量辨识&#xff08;机械参数辨识&#xff1a;辨识 or 观测&#xff09;先进控制方案&#xff08;算法环节&#xff09;SMC、ADRC、自适应、扰动观测…

Ubuntu22.04安装中文输入法►由踩坑到上岸版◄

Ubuntu22.04安装中文输入法►由踩坑到上岸版◄ 了解入坑上岸 更新一发&#xff1a;Gedit中文乱码问题的解决 为了方便回忆和记录甚至后面继续重装系统&#xff0c;我还是写一下以便将来用到或参考&#xff5e; 了解 安装Ubuntu22.04&#xff08;截至2023年08月26日11&#xff…

stm32读写片内flash项目总结(多字节读写tongxindu)

1.flash操作驱动程序 a头文件 #ifndef FLASH_H #define FLASH_H #include “stm32f4xx.h” #define BOARD_NUM_ADDR 0x0800C000 #define STM32_FLASH_BASE 0x08000000 //STM32 FLASH的起始地址 #define FLASH_WAITETIME 50000 //FLASH等待超时时间 //FLASH 扇区的起始地址…

石油石化行业网络监控运维方案,全局态势感知,实时预警

石油石化行业是一个高科技密集型行业&#xff0c;投资巨大、人员众多&#xff0c;各产业价值链的关联度较高&#xff0c;大型石油石化企业实现了上中下游产业的一体化协同发展。随着工业4.0时代的来临&#xff0c;信息化和工业化融合&#xff0c;物联网、云计算等新技术的普及推…

Typore 亲测有效(懂得都懂哈)

Typore 亲测从安装到使用&#xff0c;可以使用&#xff08;具体是什么懂得都懂哈&#xff09; 网盘下载地址:链接&#xff1a;https://pan.baidu.com/s/1w0UiS1szxnO9Lxz6sbXEKg?pwdqwe1 提取码&#xff1a;qwe1 第一步&#xff1a; 下载压缩包进行解压&#xff0c;解压过…

Dataset类实践

Dataset类实践 蚂蚁蜜蜂分类数据集和下载链接https://download.pytorch.org/tutorial/hymenoptera_data.zip Dataset&#xff1a;提供一种方式去获取数据及其lable Q&#xff1a;如何获取每个数据及其lable 重写构造方法和获取标签方法 Q&#xff1a;告诉我们总共有多少数据 …

探索Java集合框架—数据结构、ArrayList集合

一、背景介绍 Java集合的使用相信大家都已经非常得心应手&#xff0c;但是我们怎么做到知其然&#xff0c;更知其所以然这种出神入化的境界呢&#xff1f;我们揭开集合框架底层神秘面纱来一探究竟 目录 一、背景介绍 二、思路&方案 数据结构是什么&#xff1f; 数据结…

cortex-A7 SPI实验 --- STM32MP157

实验目的&#xff1a; 1、数码管显示相同的值 0000 1111 ......9999 2、数码管显示不同的值 1234 一&#xff0c;SPI概念 1&#xff0c;SPI总线是 全双工三线 / 四线同步串行总线&#xff0c;有两根单向数据线(MOSI &#xff0c;MISO)&#xff0c;一根设备片选线&#xff0…

基于SSM的小说网站的设计与实现(论文+源码)_kaic

目 录 1 绪论................................................................................................... 1 1.1 项目背景................................................................................................................ 1 1.2 发展历程..…

《QT+PCL 第五章》点云特征-PFH

QT增加点云特征PFH 代码用法代码 #include <pcl/io/pcd_io.h> #include <pcl/features/normal_3d.h> #include <pcl/features/pfh.h>int main

如何用Python实现转行高薪梦?三个热门方向带你入门

Python是一门非常适合转行的编程语言&#xff0c;它有着丰富的应用场景和学习资源&#xff0c;而且语法简单易懂&#xff0c;学习效率高。如果你想要用Python实现转行梦想&#xff0c;那么你可能会问&#xff0c;Python有哪些热门的工作方向&#xff1f;小编这就为你介绍Python…

VUE笔记(四)vue的组件

一、组件的介绍 1、组件的作用 整个项目都是由组件组成 可以让代码复用&#xff1a;相似结构代码可以做成一个组件&#xff0c;直接进行调用就可以使用&#xff0c;提高代码复用性 可以让代码具有可维护性&#xff08;只要改一处&#xff0c;整个引用的部分全部都变&#xf…

SpringBoot的日志级别你了解吗(自定义打印日志)?

1 SpringBoot日志介绍 ⽇志是程序的重要组成部分&#xff0c;想象⼀下&#xff0c;如果程序报错了&#xff0c;不让你打开控制台看⽇志&#xff0c;那么你能找到报错的原因吗&#xff1f; 如果是简单的错误有可能找出来&#xff0c;但是对于开发中的大多数错误还是需要我们打开…

el-backtop返回顶部的使用

2023.8.26今天我学习了如何使用el-backtop组件进行返回页面顶部的效果&#xff0c;效果如&#xff1a; <el-backtop class"el-backtop"style"right: 20px; bottom: 150px;"><i class"el-icon-caret-top"></i></el-backtop&…

WebGL 绘制函数gl.drawArrays

gl.drawArrays&#xff08;&#xff09;的第1个参数 WebGL方法gl.drawArrays&#xff08;&#xff09;既强大又灵活&#xff0c;通过给第1个参数mode指定不同的值&#xff0c;在这个参数上指定不同的值&#xff0c;我们可以按照不同的规则绘制图形。 下图中的7种基本图形是We…

Java项目-苍穹外卖-Day05-Redis技术应用

1.店铺营业状态设置 需求分析和设计 左上角要求是有回显的 所以至少两个接口 1.查询营业状态接口&#xff08;分为了管理端和用户端&#xff09; 2.修改营业状态接口 因为管理端和用户端路径不同&#xff0c;所以现在是至少三个接口的 可以发现如果存到表里除了id只有一个…

【Day-20慢就是快】代码随想录-栈与队列-删除字符串中的所有相邻重复项

给出由小写字母组成的字符串 S&#xff0c;重复项删除操作会选择两个相邻且相同的字母&#xff0c;并删除它们。 在 S 上反复执行重复项删除操作&#xff0c;直到无法继续删除。 在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。 例&#xff1a; 输入&#xff…

Linux学习(三)----文件打开及创建

1 demo1.c的建立 首先打开终端输入 touch file1 接着输入&#xff1a; vi demo1.c 接着重新打开一个终端&#xff0c;输入&#xff1a; man 2 open 2 demo1.c内容编辑 2.1 复制头文件 2.2 程序基础框架 #include <sys/types.h> #include <sys/stat.h>#include &l…

同态比较算法

参考文献&#xff1a; [PS73] Paterson M S, Stockmeyer L J. On the number of nonscalar multiplications necessary to evaluate polynomials[J]. SIAM Journal on Computing, 1973, 2(1): 60-66.[IZ21] Iliashenko I, Zucca V. Faster homomorphic comparison operations …

基于蛾群算法优化的BP神经网络(预测应用) - 附代码

基于蛾群算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码 文章目录 基于蛾群算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码1.数据介绍2.蛾群优化BP神经网络2.1 BP神经网络参数设置2.2 蛾群算法应用 4.测试结果&#xff1a;5.Matlab代码 摘要…