小研究 - Java虚拟机性能及关键技术分析
利用specJVM98和Java Grande Forum Benchmark suite Benchmark集合对SJVM、IntelORP,Kaffe3种Java虚拟机进行系统测试。在对测试结果进行系统分析的基础上,比较了不同JVM实现对性能的影响和JVM中关键模块对JVM性能的影响,并提出了提高JVM性能的一些展望。
目录
1 Java虚拟机的关键技术
1.1 字节码执行方式
1.2 自动内存管理
2 JVM 性能的分析和比较
2.1 JVM 的选择
2.2 JVM 性能测试
2.3 JVM 性能的分析和比较
3 结语
Java语言的平台无关性、安全性、自动内存管理等特性,使Java语言得到广泛的应用。Java虚拟机JVM)是 Java平台的核心,JVM读入Java 类文件并执行类文件中的字节码。在一个平台只要有1 个Java虚拟机就可执行Java程序,实现Java语言的平台无关性。Java的字节码中无影响系统安全的指令,同时,JVM读入类文件时,需要预验证类文件,这两点保证了Java语言的安全性。自动内存管理减轻了Java程序员的负担,提高了应用程序的可靠性。但这些特性,使Java的性能受到了一定的影响。字节码执行方式(Execute Engine)和自动内存管理是影响 Java 虚拟机性能的关键模块。本文通过比较几种有代表性的 Java 虚拟机的实现,分析了JVM 中的这2 个关键技术。
1 Java虚拟机的关键技术
1.1 字节码执行方式
最早的Java虚拟机采用的是解释(Interpreter)执行的方式,这种方式效率极低,但JVM的可移植性较好。目前主流的 Java 虚拟机基本采用即时 JIT,Just—In-Time) 编译的方法执行字节码,即将 Java的字节码动态编译为本地的机器码,效率较高,好的JIT 编译效果可以接近 C 语言静态编译的效果。但JIT在执行任何一个方法时,都需要先将该方法编译为本地代码,需要额外的内存存放编译后的本地代码。对于程序中执行频度较低的方法,由于增加了编译的时间,其效率不如解释执行的情况。衡量一个JIT好坏的标准包括编译的代码质量、编译的代码大小以及编译的时间这3个方面。自适应优化(Adap-tive Optimization)是字节码执行的第3 种方式,其实质是混合执行(Mixed code execute)。自适应优化在第1次调用一个方法时,先采用解释执行的方式,当这个方法的调用达到一定的频度而成为“热点”(Hot spot 的方法后,将该方法编译为本地代码,以后对该方法的调用,直接执行编译后的本地代码。
1.2 自动内存管理
自动内存管理也称为垃圾收集(GC,Garbage Collection) ,其作用是自动回收无用单元的内存空间,释放内存的工作由Java虚拟机自动管理,减轻了应用程序员的负担,避免了Java应用程序的内存泄漏。垃圾收集算法的主要评价标准为吞吐量(Throughput)和停顿时间(Pause time) 2个方面。吞吐量指在程序运行中,非垃圾收集的时间与整个应用程序运行时间的比值,比值越高,垃圾收集算法的整体效率越高。
2 JVM 性能的分析和比较
2.1 JVM 的选择
在本测试中,选择了3 个有代表性的虚拟机实现作为研究的对象。
1) Sun Hotspot Client VM 1.4.1 (SJVM) 【1.是Sun公司提供的针对J2SE平台的虚拟机,采用了自适应优化的字节码执行方式、基于代(Generation)的垃圾收集机制、标记-清除(Mark-Sweep)算法和拷贝算法结合的算法。
2) Intel Open Runtime Platform 1.0.10 (Intel ORP 2.是Intel公司提供的Java 虚拟机,提供了针对IA32架构优化的JIT编译器,采用增量式的Train垃圾收集算法。
3)Kaffe 1.0.73.是开放源代码的Java虚拟机实现,它支持的平台较多,垃圾收集机制采用了不分代的保守的标记一清除算法,并提供了 JIT 的编译器。
2.2 JVM 性能测试
通过Benchmark集合的测试,能够有效的比较和分析不同JVM实现对性能的影响以及JVM中关键模块对JVM性能的影响。在本测试中,测试用的Benchmark集合为specJVM98【4】和Java Grande Forum Benchmark suite5.specJVM98采用的是接近真实的应用程序,主要包括Db、Compress、Jess、Javac、Mep-gaudio、Mtrt、Jack7个应用程序。Java Grande Forum Benchmark (以下简称JGF)包括3个部分的测试,第1部分为基本的底层操作,包括算术、赋值、方法调用、异常处理等;第2部分为核心的操作,包括加密、堆排序、矩阵相乘等算法;第3部分为大规模的应用程序,包括了Alpha-beta剪枝搜索、RayTracer等算法。本测试采用的操作系统为Red Hat Linux 7.3.硬件平台为AMD Athlon 1700+,内存256M。图1为specJVM98的测试结果,图2 至图4为JGF3个部分的测试结果。
2.3 JVM 性能的分析和比较
在Java虚拟机中影响性能的模块主要是即时编译和垃圾收集这两个模块。即时编译模块的性能包括编译时间和编译后代码质量两方面。垃圾收集模块主要从吞吐量和停顿时间2 个方面来衡量。
从图1可以看出,Kaffe虚拟机的性能较差,除了第一项测试compress接近SJVM和Intel ORP的性能外,其它测试中的性能表现低于另2个虚拟机的一半。Intel ORP在Compress, Mepgaudio2项测试中要略高于SJVM,而SJVM的性能在其他测试中表现最好。因此,从specJVM98的测试结果来看,SJVM的虚拟机表现最好,Intel ORP的性能较接近SJVM, Kaffe的性能与这两者间有一定的差距。
从图2、图3、图4可以看出:对于JGF基本底层和核心部分的测试,Intel ORP和SJVM的性能相差不大,Kaffe 的性能都低于前两者;对于大规模应用程序的测试,SJVM 的性能远好于 Intel ORP 和Kaffe,而Intel ORP的性能好于Kaffe,这个程序的详细运行结果见表1。
从表1可以看出:Kaffe 的 GC 时间为Intel ORP 的4.79 倍,非GC (大部分为JIT) 时间为Intel ORP的27.87%,非GC时间占整个运行时间的6.40%; Kaffe与Intel ORP相比,大部分的时间花费在JIT编译上; Intel ORP的GC时间为SJVM的25.77倍,非GC时间为SJVM的1.26倍;GC时间占整个运行时间的45.95%。
从以上分析可以看出:
1) SJVM的整体性能是最好的,大部分的性能高于Kaffe和Intel ORP,尤其是在JGF大规模应用程序的测试部分,它的性能远远高于Kaffe和Intel ORP。这是由于字节码执行方式采用了自适应优化的算法,只编译最常用的“热点”方法,同时编译的代码质量较高。
2) SJVM垃圾收集机制较好,也是其性能高于其它两个JVM的关键原因。Intel ORP的即时编译较好,接近SJVM采用的自适应优化的算法,但垃圾收集表现较差,在测试中,一些Benchmark的程序未能正确运行,其语言支持不好。
3) Kaffe的性能表现比较差,主要原因是由于即时编译较差,同时垃圾收集机制的算法也较粗糙。
3 结语
JIT 编译和垃圾收集模块是 JVM 中影响性能的关键模块。JIT 编译的实现与体系结构的关系密切,实现时应充分考虑体系结构的影响,针对目标平台优化。垃圾收集机制的平台相关性较小,实现垃圾收集时,考虑较多的是算法上的提高。当然,不同平台上的内存管理机制还是有差别的,如不同平台上实现虚拟内存的方式、实现cache的方式都有可能不同,这也是提高一个特定平台上垃圾收集机制时需要考虑的因素。
相关文章:

小研究 - Java虚拟机性能及关键技术分析
利用specJVM98和Java Grande Forum Benchmark suite Benchmark集合对SJVM、IntelORP,Kaffe3种Java虚拟机进行系统测试。在对测试结果进行系统分析的基础上,比较了不同JVM实现对性能的影响和JVM中关键模块对JVM性能的影响,并提出了提高JVM性能的一些展望。…...

Repo manifests默认default.xml清单文件中的各个标签详解
Repo简介 “Repo” 是一个用于管理多个Git存储库的工具,通常与Google的Android开发项目一起使用。它允许您在一个命令下轻松地进行多个Git存储库的同步、下载和管理。 repo下载安装 从清华镜像源下载 mkdir ~/bin PATH~/bin:$PATH curl https://mirrors.tun…...

javacv基础02-调用本机摄像头并预览摄像头图像画面视频
引入架包: <dependency><groupId>org.openpnp</groupId><artifactId>opencv</artifactId><version>4.5.5-1</version></dependency><dependency><groupId>org.bytedeco</groupId><artifactId…...

【Nginx21】Nginx学习:FastCGI模块(三)缓冲区与响应头
Nginx学习:FastCGI模块(三)缓冲区与响应头 缓存相关的内容占了 FastCGI 模块将近一小半的内容,当然,用过的人可能不多。而今天的内容说实话,我平常也没怎么用过。第一个是缓冲区相关的知识,其实…...

正则表达式(常用字符简单版)
量词 字符类 边界匹配 分组和捕获 特殊字符 字符匹配 普通字符:普通字符按照字面意义进行匹配,例如匹配字母 "a" 将匹配到文本中的 "a" 字符。元字符:元字符具有特殊的含义,例如 \d 匹配任意数字字符…...

从零开始学习Python爬虫:详细指南
导言: 随着互联网的迅速发展,大量的数据可供我们利用。而Python作为一种简单易学且功能强大的编程语言,被广泛应用于数据分析和处理。学习Python爬虫技术,能够帮助我们从互联网上获取数据,并进行有效地分析和利用。本文…...

分布式计算框架:Spark、Dask、Ray
目录 什么是分布式计算 分布式计算哪家强:Spark、Dask、Ray 2 选择正确的框架 2.1 Spark 2.2 Dask 2.3 Ray 什么是分布式计算 分布式计算是一种计算方法,和集中式计算是相对的。 随着计算技术的发展,有些应用需要非常巨大的计算能力才…...

什么是伪类链(Pseudo-class Chaining)?
聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ Pseudo-class Chaining⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅!这个专栏是为那些对Web开发感兴趣、刚刚…...

每日一题:leetcode 57 插入区间
给你一个 无重叠的 ,按照区间起始端点排序的区间列表。 在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。 示例 1: 输入:intervals [[1,3…...

第五节:实现自己的第一个environment
本专栏是强化学习运用在买卖股票之上的入门学习内容。 主要解决强化学习代码落地和代码实践,不需要学习相关数学原理,直观简单的带领读者入门强化学习炒股。 查看本专栏完整内容,请访问:https://blog.csdn.net/windanchaos/category_12391143.html 本文发布地址:https://b…...

无套路,财务数据分析-多组织损益表分析分享
在报表众多的财务数据分析中,损益表是老板们最关注的报表,特别是当有多组织时,损益表的分析就变得更加重要了。以前受限于数据分析工具,做损益表分析时很难做到多维度灵活分析,但随着BI数据可视化工具的发展࿰…...

Java并发编程第6讲——线程池(万字详解)
Java中的线程池是运用场景最多的并发框架,几乎所有需要异步或并发执行任务的程序都可以使用线程池,本篇文章就详细介绍一下。 一、什么是线程池 定义:线程池是一种用于管理和重用线程的技术(池化技术),它主…...

AI + Milvus:将时尚应用搭建进行到底
在上一篇文章中,我们学习了如何利用人工智能技术(例如开源 AI 向量数据库 Milvus 和 Hugging Face 模型)寻找与自己穿搭风格相似的明星。在这篇文章中,我们将进一步介绍如何通过对上篇文章中的项目代码稍作修改,获得更…...

归并排序(Java 实例代码)
目录 归并排序 一、概念及其介绍 二、适用说明 三、过程图示 四、Java 实例代码 MergeSort.java 文件代码: 归并排序 一、概念及其介绍 归并排序(Merge sort)是建立在归并操作上的一种有效、稳定的排序算法,该算法是采用分…...

【VUE】数字动态变化到目标值-vue-count-to
vue-count-to是一个Vue组件,用于实现数字动画效果。它可以用于显示从一个数字到另一个数字的过渡动画。 插件名:vue-count-to 官方仓库地址:GitHub - PanJiaChen/vue-countTo: Its a vue component that will count to a target number at a…...

Mysql /etc/my.cnf参数详解(二)
#buffer相关 #buffer pool根据实际内存大小调整,标准为物理内存的50% innodb_buffer_pool_size15996M //默认值128M,innodb_buffer_pool_size | 134217728 key_buffer_size 33554432 #根据物理内存大小设置 确保每个instance内的内存2G左右 <5000 1,>5000 &…...

AUTOSAR规范与ECU软件开发(实践篇)6.10AUTOSAR操作系统概念与配置方法介绍(下)
目录 2、 RTA-OS工程创建 3、 AUTOSAR操作系统配置方法 (1) 描述文件导入 (2) Counter配置...

蓝牙 - 经典蓝牙物理信道介绍
物理信道有多种类型。所有蓝牙物理信道的特点都是一组物理层的频率与时间参数相结合,并受到空间因素的限制。对于基本的和经过调整的蓝牙组网(piconet)所用物理信道,跳频用于定期改变频率,以减少干扰影响,同时也是出于监管原因。 …...

性能测试中未做集群时,在登入中已经保存了登入的session,但可能会出现在不同的服务器上显示登入失败
Session未进行集群共享时,则会出现服务器2,未登录...

Python环境下载安装使用
天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…...

图像扭曲之波浪扭曲
源码: void wave_sine(cv::Mat& src,cv::Mat& dst,double amplitude,double wavelength) {dst.create(src.rows, src.cols, CV_8UC3);dst.setTo(0);double xAmplitude amplitude;double yAmplitude amplitude;double xWavelength wavelength;double yWa…...

《自动驾驶与机器人中的SLAM技术》之GNSS相关基础知识总结
简介 本篇基于对《自动驾驶与机器人中的SLAM技术》中的GNSS定位相关基础知识进行总结用于备忘 知识点整理 GNSS(全球卫星导航系统)定位原理 GNSS 通过测量自身与地球周围各卫星的距离来确定自身的位置 , 而与卫星的距离主要是通过测量时间间隔来确定的 GNSS与GPS的关系 GPS(…...

【前端|CSS系列第4篇】面试官:你了解居中布局吗?
欢迎来到前端CSS系列的第4篇教程!如果你正在寻找一种简单而又强大的前端技术,以使你的网页和应用程序看起来更加专业和美观,那么居中布局绝对是你不能错过的重要知识。 在前端开发中,实现居中布局是一项必备技能,无论…...

安全物理环境技术测评要求项
1.物理选择-保证等级保护对象物理安全的前提和基础 1-0/2-2/3-2/4-2(级别-要求项数量) a)具备防震、防风、防雨能力 b)避免顶层或地下室,否则应加强防水、防潮措施 测评实施重点: 1)机房场地所在…...

SAP MTS案例教程PP生产前台操作
目录 本章介绍 2 生产订单相关操作 3 批量查询生产订单 3 单个显示生产任务单 5 生产订单批量可用性检查 6 显示短缺部件信息 8 修改生产订单 9 重读工单计划主数据 11 单个下达生产订单 12 批量下达生产订单 13 非倒冲生产方式操作过程 15 多个工单批量发料 15 单个工单发料 1…...

Celery task 执行报错 TypeError: Object of type set is not JSON serializable 问题分析处理
情况描述: 定义了新的shared_task推送到生产环境后,发现无法执行,会报错set对象无法序列化,报错内容如下: Traceback (most recent call last):File "/tmp/venv/lib64/python3.6/site-packages/kombu/serializati…...

【大魔王送书第一期】《一名阿里服务端开发工程师的进阶之路》
一、前言 目前,资讯、社交、游戏、消费、出行等丰富多彩的互联网应用已经渗透到了人们生活和工作的方方面面,正深刻改变着信息时代。随着用户规模的增长和应用复杂度的上升,服务端面临的技术挑战越来越严峻。在头部互联网企业,服…...

[FPGA IP系列] BRAM IP参数配置与使用示例
FPGA开发中使用频率非常高的两个IP就是FIFO和BRAM,上一篇文章中已经详细介绍了Vivado FIFO IP,今天我们来聊一聊BRAM IP。 本文将详细介绍Vivado中BRAM IP的配置方式和使用技巧。 一、BRAM IP核的配置 1、打开BRAM IP核 在Vivado的IP Catalog中找到B…...

react ts
一、项目搭建 1、创建项目 使用vite生成项目 npx create-react-app react-ts-project --template typescript 启动项目 yarn start 删除无用组件 2、设计目录结构 资源说明http网络请求assets公共资源components组件router路由配置utils工具模块store状态机App.tsx应用…...

配置MySQL
配置MySQL_5.7.16 一级目录2.1.1 安装包准备2.1.2 安装MySQL2.1.3 配置MySQL 一级目录 2.1.1 安装包准备 1)将安装包和JDBC驱动上传到/opt/software,共计6个 01_mysql-community-common-5.7.16-1.el7.x86_64.rpm 02_mysql-community-libs-5.7.16-1.el…...