热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

多租户JVM技术前瞻

IBM多租户JVM(MultitenantJVM)目前随着IBMJAVA8beta版已经发布。通过在一个多租户JVM上运行多个应用程序,云

IBM多租户JVM(Multitenant JVM)目前随着IBM JAVA 8 beta版已经发布。通过在一个多租户JVM上运行多个应用程序,云系统可以加速应用系统的启动时间、减少应用系统内存消耗。主要开发者Graeme Johnson和Michael Dawson撰文介绍了多租户云系统JVM背后的技术,并讨论了主要成本以及其带来的收益。

\u0026#xD;\n

文章首先介绍了多租户JVM诞生的背景:

\u0026#xD;\n
\u0026#xD;\n

对于运行系统、提供服务所需的基础设施,云供应商必须权衡其成本消耗及其可带来的收益。这种利弊权衡迫使供应商寻找多种系统架构。云供应商目前可从无共享架构到多用户共享架构范围内进行选择。无共享架构中,供应商提供面向单一用户的软件、硬件及应用程序。多用户共享架构中,多个用户共同使用供应商提供的同一款应用软件,并共享底层软件、硬件。

\u0026#xD;\n

选择框架主要需要权衡密集度(density) 与隔离性(isolation)。密集度指特定软硬件可提供的系统和服务的数目。共享度越高,密集度就越高。密集度越高,供应商成本越低。同时,共享度的增高将降低租户(tenants,指交付的单个系统或服务)间的隔离性。隔离性描述了单个租户对活动与其他租户数据的影响程度。

\u0026#xD;\n

对于基于JAVA的租户,可按是否共享JVM对框架进行划分。任何共享顶层应用的框架一定共享了JVM。共享JVM既可以节省内存又可以节省处理时间。但是在传统的JVM技术中,共享JVM将导致基础架构层失去隔离性,从而要求顶层应用提高自身隔离性以满足架构需求。本文介绍的多用户共享架构已在IBM最新发布的JAVA 8测试版中进行实验,并且成功。这个架构具有传统共享JVM架构优点,此外还表现出优于传统共享JVM框架的隔离性。

\u0026#xD;\n
\u0026#xD;\n

使用多用户共享JVM最大的优点是部署可以避免多个标准JVM相关的内存消耗。这种内存消耗主要来自:

\u0026#xD;\n
  • Java堆消耗成百上千兆的内存。而且即使对象是相同的,堆对象也不能在JVM之间共享。此外,JVM还倾向于使用所有分配给他们的堆,即使它们只在在很短的时间才会用到峰值量。\u0026#xD;\n
  • 因为生成的代码是私有的并且消耗内存,所以JIT编译器需要占用几十兆的内存。代码的生成也需要消耗大量的处理器时间,而这会使应用运行变慢。\u0026#xD;\n
  • 类的内部结构占用内存(很多组成部分还会存在所有应用中,如String,Hashtable)。而且这些结构在每一个JVM中都会有一个实例。\u0026#xD;\n
  • 每个JVM会给每个核分配一个默认的垃圾收集辅助线程,同时每个JVM还有多个编译线程。垃圾收集活动和编译活动可以一个或多个的JVM中同时出现,但是考虑到JVM会竞争有限的处理器时间,这种现象不是非常理想。\u0026#xD;\n

多租户JVM可以减少内存占用、降低处理成本,除此之外,相对于传统的在单个JVM上运行多个应用的方式,多租户JVM还可以提供了更好的隔离性。

\u0026#xD;\n

另外一个益处来自启动时间的缩短:当第一个租户启动后,后续启动的应用将需要少于第一个的启动时间,因为JVM已经在运行了。启动时间的减少有利于运行周期短的程序的使用。而且我们在脚本处理时经常会用到这类程序。

\u0026#xD;\n

当然,鱼和熊掌不可兼得。多租户JVM的缺点包括:

\u0026#xD;\n
  • 相比于多个应用运行在单个隔离的JVM这种传统方式,多租户JVM的主要弊端来自于隔离性的降低。例如,多租户JVM中一个原生崩溃(native crash)可以影响到所有租户。\u0026#xD;\n
  • 为了执行JVM工作我们必须要执行多租户扩展(multitenancy extensions),这会对性能带来不好的影响。然后,这影响会随着租户数量的增加而下降——因为通过在同一个系统运行多个JVM我们可以避免处理器和内存的浪费。\u0026#xD;\n

接着,文章简单介绍了如何启动多租户JVM。

\u0026#xD;\n

为了和其它租户共享运行时间,应用程序使用者需要在启动应用程序时在启动应用程序时加入一个单变量,例如:java -Xmt -jar one.jar

\u0026#xD;\n

这样操作的结果会使应用程序好像运行在其专用的JVM一样。但实际上它和其它应用程序运行在同一个JVM中。多租户JVM扩展使以这种方式启动应用成为可能,并且它还为共享JVM的多租户提供隔离性。当一个租户启动后,JVM启动器会选择定位在现有的共享JVM后台程序(javad)或者在必要的时候启动,当第二个租户启动时,这个租户会找到现有的共享JVM后台程序并且用这个JVM进行运行,这样做的结果是这两个租户共同的引导程序会出现在javad过程。这种布置使租户可以共享大部分运行时的结构。我们只需要对命令行进行有限的修改,就可以实现通过多租户共享JVM运行现有的应用程序,这一方法很简单。

\u0026#xD;\n

多租户JVM目前还有一些限制,主要包括:

\u0026#xD;\n
  • JNI natives——多租户共享JVM并没有给JNI native提供隔离性。因此,含有用户添加的JNI native的应用程序在多用户共享JVM中运行并不一定稳定。这些应用程序可能会影响整个JVM的运行并获取其他租户的信息。考虑到原生代码需要足够的“信任”(例如众所周知的中间件),这个风险可能是可以接受的。此外,操作系统只允许共享JVM进程下载一份共享库的副本,而且这个副本是原生代码的所在地。这就导致当多个租户共享同一个库时,他们不能载入相同的原生代码。\u0026#xD;\n
  • JVMTI(Java虚拟机工具接口):因为调试和分析功能会影响到所有共享JVM服务器的租户,所有多租户JDK目前还不支持这些功能。这也是我们将来工作中要解决的问题。\u0026#xD;\n
  • GUI项目:诸如SWT的库在原生层层是全局声明的,所有多租户JDK目前还不支持这些库。\u0026#xD;\n

在11月1日开幕的QCon全球企业开发大会(上海站),参与者将有兴趣聆听Java专题“Java Innovation”讲师的经验分享:

\u0026#xD;\n
\u0026#xD;\n

即将发布的Java 8可以说是自1995年Java初发布以来最大的语言层面的改动之一.其中最主要的变化就是Project Lambda的引入,而Project Lambda背后的核心就是invokedynamic这个新增的JVM instruction。

\u0026#xD;\n

本主题以面向普通开发人员的角度针对Project Lambda对Java语言带来的变化,以及invokedynamic是什么,它的来源及与Lambda的关系进行阐述.附带会介绍invokedynamic对JVM上其它语言比如JRuby的影响。

\u0026#xD;\n


推荐阅读
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
  • 恶意软件分析的最佳编程语言及其应用
    本文介绍了学习恶意软件分析和逆向工程领域时最适合的编程语言,并重点讨论了Python的优点。Python是一种解释型、多用途的语言,具有可读性高、可快速开发、易于学习的特点。作者分享了在本地恶意软件分析中使用Python的经验,包括快速复制恶意软件组件以更好地理解其工作。此外,作者还提到了Python的跨平台优势,使得在不同操作系统上运行代码变得更加方便。 ... [详细]
  • OpenMap教程4 – 图层概述
    本文介绍了OpenMap教程4中关于地图图层的内容,包括将ShapeLayer添加到MapBean中的方法,OpenMap支持的图层类型以及使用BufferedLayer创建图像的MapBean。此外,还介绍了Layer背景标志的作用和OMGraphicHandlerLayer的基础层类。 ... [详细]
  • 原文地址:https:www.cnblogs.combaoyipSpringBoot_YML.html1.在springboot中,有两种配置文件,一种 ... [详细]
  • Google Play推出全新的应用内评价API,帮助开发者获取更多优质用户反馈。用户每天在Google Play上发表数百万条评论,这有助于开发者了解用户喜好和改进需求。开发者可以选择在适当的时间请求用户撰写评论,以获得全面而有用的反馈。全新应用内评价功能让用户无需返回应用详情页面即可发表评论,提升用户体验。 ... [详细]
  • 如何搭建Java开发环境并开发WinCE项目
    本文介绍了如何搭建Java开发环境并开发WinCE项目,包括搭建开发环境的步骤和获取SDK的几种方式。同时还解答了一些关于WinCE开发的常见问题。通过阅读本文,您将了解如何使用Java进行嵌入式开发,并能够顺利开发WinCE应用程序。 ... [详细]
  • 如何用JNI技术调用Java接口以及提高Java性能的详解
    本文介绍了如何使用JNI技术调用Java接口,并详细解析了如何通过JNI技术提高Java的性能。同时还讨论了JNI调用Java的private方法、Java开发中使用JNI技术的情况以及使用Java的JNI技术调用C++时的运行效率问题。文章还介绍了JNIEnv类型的使用方法,包括创建Java对象、调用Java对象的方法、获取Java对象的属性等操作。 ... [详细]
  • Java和JavaScript是什么关系?java跟javaScript都是编程语言,只是java跟javaScript没有什么太大关系,一个是脚本语言(前端语言),一个是面向对象 ... [详细]
  • 如何实现JDK版本的切换功能,解决开发环境冲突问题
    本文介绍了在开发过程中遇到JDK版本冲突的情况,以及如何通过修改环境变量实现JDK版本的切换功能,解决开发环境冲突的问题。通过合理的切换环境,可以更好地进行项目开发。同时,提醒读者注意不仅限于1.7和1.8版本的转换,还要适应不同项目和个人开发习惯的需求。 ... [详细]
  • 本文介绍了在sqoop1.4.*版本中,如何实现自定义分隔符的方法及步骤。通过修改sqoop生成的java文件,并重新编译,可以满足实际开发中对分隔符的需求。具体步骤包括修改java文件中的一行代码,重新编译所需的hadoop包等。详细步骤和编译方法在本文中都有详细说明。 ... [详细]
  • 本文概述了JNI的原理以及常用方法。JNI提供了一种Java字节码调用C/C++的解决方案,但引用类型不能直接在Native层使用,需要进行类型转化。多维数组(包括二维数组)都是引用类型,需要使用jobjectArray类型来存取其值。此外,由于Java支持函数重载,根据函数名无法找到对应的JNI函数,因此介绍了JNI函数签名信息的解决方案。 ... [详细]
  • 使用freemaker生成Java代码的步骤及示例代码
    本文介绍了使用freemaker这个jar包生成Java代码的步骤,通过提前编辑好的模板,可以避免写重复代码。首先需要在springboot的pom.xml文件中加入freemaker的依赖包。然后编写模板,定义要生成的Java类的属性和方法。最后编写生成代码的类,通过加载模板文件和数据模型,生成Java代码文件。本文提供了示例代码,并展示了文件目录结构。 ... [详细]
author-avatar
奶爸集丶训营_502
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有