开发者学堂课程干货总结——Java 虚拟机原理(四)

简介: Java 虚拟机原理课时1.4——Dragonwell特性:多租户。通过本节课的学习,能够掌握Java 虚拟机原理,学习JNI、类加载器原理、safepoint机制等知识。 电子书+视频为同学带来最佳学习效果,文字、课程链接、图谱地址统统为大家放送了哦!

各位同学,开发者学堂Java 图谱中Java 高级工程师篇的课程“Java 虚拟机原理”的课程给开始更新了,第四课时“Dragonwell特性:多租户”的干货总结来啦!一起学习新课程吧!

课程链接以及图谱地址小编已经为大家指路了,搭配学习效果更佳👇

课程名称:Dragonwell特性:多租户

课程地址:https://developer.aliyun.com/learning/course/56/detail/1065

图谱名称:Alibaba Java 技术图谱

图谱地址:https://developer.aliyun.com/graph/java


Dragonwell特性:多租户


1、JAVA语言的特点 

JAVA语言的特点如下图可以看到企业级性能好,稳定,生态丰富,JavaEE的标准非常好,后面还有跨平台的特性,按层次来看 Java平台,Java硬件上是arm或者x86或者PowerPC等等不同CPU,在此之上操作系统是如windows、Linux、Mac OS,再往上是JAVA platform,是一个平台,因为只要根据 Java平台来写应用,可以完全不管操作系统以及硬件的一些具体实现细节,跨平台是Java的一个主要卖点,在此之上Java定义了 Java1g2e的标准,然后Tom KateAPACHE等各种组件其实都是从JAVA EE的标准里面衍生出来的,帮助Java很好的成长,按照 Java一开始设计的人目标去成长。 

生态丰富特点,因为Java上有Tom KateAPACHE spring等各种生态,开箱即用,开发应用非常简单企业级性能好,Java它适合于运行一种大型长期运行的程序,稳定性非常好如运行一个Linux server加 JVM的一个组合,可能几年都不用重启,可以跑得非常好 

2、一次编译到处执行 

一次编译到处执行是Java的一个很大的卖点通过一段代码来了解Java内是如何被加载和执行的如在应用代码里面去调用 new Gson(). from Json(..);然后有一个new byte code会触发loadClass()机制,还要去找com.google.gson.GsonloadClass方法,去找Jar,因为应用的class 下有很多Jar包,如commons-io.jar、myaql-connector.jar、gson.jar,找到gson.jar里面有com.google/gson/Gson.class文件,然后会把 Class给读出来,读成一个byte的数组,调用一个define class JVM的接口,define class会进行parse、verify、link调出,最终达到一个可以让Jvm识别的 byte code,Jvm解释器会去执行byte code到2000次以后,会运行一个client compiler让代码编译到c1级别,c1级别其实已经在native执行了,同时会收集一些provide信息,帮助编译到更高的优化级别c2,然后到15,000次以后会进入到最快的c2级别interpret和c2之间可能大概有50倍的差距,所以Java1开始是很慢的,但只要跑稳后是非常快的 

image.png 

通过上述,一段代码想要被执行,生命周期是非常长的,优点是这种跨平台性,可以收集的信息越跑越快,缺点就是Java代码装载的开销非常大。 

3、内存管理 

Java的垃圾回收管理GC, heap就是Java里面实际做管理的内存,是虚拟内存一开始如设4Gheap,会想操作系统,申请4G的heap,这些配置其实都没有被申请出来,是按需分配的,这是操作系统的推荐机制随着各种new Objiect页面就会被分配出来下图所示分为9个页面,就是RSS=9,中间如果发生garbage collection,即便会压缩内存的,如这里面有6个页面是空闲,他就把三个排到一起,然后剩余的内存是空闲的,但是操作系统认为依然占着这些内存,然后它是不可用的,所以RSS依然很高,因为内存很有可能随着后面的分配马上会被使用,Java也是积攒到一定程度来释放的,所以很有可能占据很大的面积 

image.png 

4、线程模型 

用Java去写server端应用的时有很多框架,如Tom Kate后面可能会有JPA、Hibernate ORM 、JDBC等组是通过一个NIO接收请求,接收到请求以后是交到一个thread pool,thread pool多线程可能并不是一种特别高效的处理并发的模型,下图可以看到一个g2e的规范,在thread的规范里面,一个外部容器怎样去处理并发的请求是通过在多线程里面去并行的调用service函数来达到的标准导致这个事件必须通过线程池来提供并发能力。 

image.png 

线程多会导致问题,上图是一张实际的执行图,每一个竖条代表一个线程,每一个色块代表一个请求,如在只有一个核的机器上去启动4个线程,其实操作系统提供能力,觉得请求是并发并行来执行的,实际上都是交替的执行分时复用的看起来是并发的,实际是交替来执行这中间就有一个切换开销是比较大的,是多线程的一个弊端。 

 

5、云原生vsJava 

总结了Java的优势云原生的应用应该是微服务的,Java是一个企业级的模式都非常庞大云原生是低内存开销,这样可以创造很多微服务,把他们更快的合并更好的和部署但Java是GC管理是大内存的云原生要求应用是快速交,Java应用启动慢,需要编译预热,中间是有一个抵触的 

6、Dragonwell 

所有的市面上的JDK产品大多都基于Open JDKOpen JDK加上 oracle的一些商业特性,然后形成的是oracle JDK,其它还有一些三方厂商,如说亚马逊都通过Open JDK进行简单的扩展,形成自己的JDK,阿里云也是通过Open JDK作为上游扩展,然后加上阿里云的一些原生特性,最终形成了阿里巴巴Dragonwell这个产品 

image.png 

7、Dragonwell:Elastic Heap 

阿里云自己的一些特性也会回归社区这里介绍Dragonwell的几个主要特性,第一个是弹性堆,就是可以把前面看到一些那问题给解决掉,把内存还给操作系统往下是进程级别,然后 Java应用级别,然后里面有JavaHeap,Java heap里面之间内存默认都是固定的,但是通过Elastic Heap机制,可能用不到这么多内存就可以把应用跑得很好,会动态的去减少Heap大小,把内存实际还给操作系统。 

下图右半部为特性的使用场景,可能有一些在线的job,比如4个应用,平时用户量很大,需要大量内存去应付多请求,所以内存是不共享的,但是到晚上可能没有多用户在访问在线应用了,可以动态的把内存给释放出来,然后提供给其他一些同级以上的离线服务,离线服务和在线服务可以捆绑,或者是复用内存,能达到一个很好的资源复用的目的 

image.png 

 

8、Dragonwell:wisp 

还有一个非常有的特性叫做wisp协这个特性可以把Java的线程映射为程,去提高Java的并发处理能力因为目前都是微服务的状态,微服务把应用拆掉之后,自然不同服务就要通信,通信的就会很多wisp提高这些io的效率。 

现在 Java有很多异步编程框架,如 VERT.X这个词的含义就是节点,跟nodejS在图算法里面其实是可以互相代替使用的,VERT.X和 node.js就是想制造一种Java里的node,希望用node的这种异步编程模型得带给Java。 

下图是Verte.x编写一个数据库的访问应用用他官方的一个APIclient.getConnection到这里不是直接的返回的connection,而是写一个call back,因为这是一个组词函数,异步的他就要写call back,然后call back里面去判断请求是否成功,成功的话可以拿到result里面一个connection,然后Connection去查一个SQL语句,比如select*FROM...”,这里同样要写一个call back result to,而不是说直接拿到 connection,一层层的回调,如果我们要继续result再去经营什么,比如说把它放到缓存里面,那里面又会进行一层嵌套的回调 

image.png 

这样代码的控制就被反转了,并且异常也看不到,如在某一层发生一个异常,因为都是从回调直接执行的,是看不到从哪调进来的这是异步编程带给我们一个问题当然异步编程是有解决方法的 

C sharpES7所提供的新特性,主要是提供了协机制,Kotlim程序作为例子,来解释这种机制如何帮助去改变义务变成模型,Kotlim里面,如果想让一段代码可以切换的话,可以用suspend标记这段代码,然后可以对一个异步函数进行封装,如client.getconnection,把它封装成client.aGet connection,实际做调用了一个非方法叫suspendCoroutine做的是调用这一段代码,并且把当前协程切走,会马上调用 getconnection,并且得到一个continuation的回调,在 get connectioncall back,如get connection实际完成的时候,会恢复程马上挂起,然后再完成恢复,这样就可以让代码临时挂起,过一段时间再回来执行,只有程可以带给的优势,整个执行站都是保留完整的,通过这种封装可以这样去写代码;Conn=clientaGetconnectionrs=connection=,aQuery同样要进行包装 

这样可以达到异步的一个性能,同时使用完全阻塞方式去写这个代码,非常高效 C sharp的程的一个解决方案但是这里对这些带Kotlim的进行封装,其实是非常繁琐的。 

9、Dragonwell:wisp原理 

wisp其实就是把所有这些需要封装注册函数全部可以做到JDK,可以看到像 g.u.c,其实都被wisp做了像上述的封装,会切走程,等到事件ready的时候再把这程切回来,用户不用关心。 

image.png 

以前阻塞的API是支持的完全不需要改代码,可以把以前的用协程写代码直接切换到程模型,进行一个模型转换这样从java thread和Pthread就操作系统1:1的模型变到调用大量wisp变成少量操作统线程,性能大大提高。 

10、Dragonwell:JWarmup 

JWarmup特性,前面提到,Java方法要执行2000次,然后在15,000次才达到一个非常高的效率这些执行其实是非常慢的,要比慢50倍并且解释执行的时候,其他编译器其实也是比较少有资源的,就编解释执行还要编译这个方法。 

行的时候CPU会打得非常高,响应特别慢JWarmu就是说让JVM提前知道哪些方法热的,在处理请求之前就让这些方法提前被编译掉,从而避免了前面边解释,边编译的开销。 

模型如图所示,首先应用被在被他环境被跑的时候,class被加载的时候,会产生一些日志,告诉哪些class是热的,然后这里进行一个record,记了一个class list,然后把 class list就是真正热的方法的一个logo文件,给分发到线上环境,然后线上环境的机器就知道哪些方法热的,在真正处理用户请求之前,会根据列表去提前把方法给编译好JWarmup它可以大大减少应用预热的一个开销。image.png 

相关文章
|
监控 安全 Java
开发者学堂课程干货总结——Java 虚拟机原理(二)
Java 虚拟机原理课时1.2——Safepoint in Hotspot 。通过本节课的学习,能够掌握Java 虚拟机原理,学习JNI、类加载器原理、safepoint机制等知识。 电子书+视频为同学带来最佳学习效果,文字、课程链接、图谱地址统统为大家放送了哦!
开发者学堂课程干货总结——Java 虚拟机原理(二)
|
3月前
|
虚拟化
vmware克隆虚拟机后没有ip地址的问题
解决vmware克隆虚拟机后没有内网ip的问题
|
4月前
|
SQL 存储 数据挖掘
【虚拟机数据恢复】VMware虚拟机文件被误删除的数据恢复案例
虚拟机数据恢复环境: 某品牌R710服务器+MD3200存储,上层是ESXI虚拟机和虚拟机文件,虚拟机中存放有SQL Server数据库。 虚拟机故障: 机房非正常断电导致虚拟机无法启动。服务器管理员检查后发现虚拟机配置文件丢失,所幸xxx-flat.vmdk磁盘文件和xxx-000001-delta.vmdk快照文件还在。服务器管理员在尝试恢复虚拟机的过程中,将原虚拟机内的xxx-flat.vmdk删除后新建了一个虚拟机,并分配了精简模式的虚拟机磁盘和快照数据盘,但原虚拟机内的数据并没有恢复。
【虚拟机数据恢复】VMware虚拟机文件被误删除的数据恢复案例
|
Linux 虚拟化 数据安全/隐私保护
VMware使用 - 虚拟机克隆
如果已经安装了一台Linux操作系统,没有必要重新安装,只需要克隆就可以了,有两种方式。
28 0
|
5月前
|
存储 网络协议 虚拟化
如何操作VMware ESXi虚拟机的迁移?
如何操作VMware ESXi虚拟机的迁移?
|
5月前
|
存储 虚拟化 数据中心
如何操作VMware ESXi虚拟机的克隆?
如何操作VMware ESXi虚拟机的克隆?
|
4月前
|
Linux 虚拟化 数据安全/隐私保护
【Linux】VMware安装虚拟机- Windows + Linux
【1月更文挑战第20天】【Linux】VMware安装虚拟机- Windows + Linux
|
2月前
|
算法 虚拟化 C++
VMware虚拟机无法自适应和拖拽复制粘贴和共享目录问题
VMware虚拟机无法自适应和拖拽复制粘贴和共享目录问题
124 0
|
7天前
|
网络协议 Linux 网络安全
虚拟机Vmware详细安装(包含kali,win7与winxp三系统相互ping与安装)
本文是一篇关于虚拟机安装和配置的教程,包括使用VMware安装虚拟机和在虚拟机中安装Kali Linux、Windows 7和Windows XP系统。作者提供了详细的步骤和截图说明,指导读者如何下载和安装VMware,以及如何从提供的链接下载预配置的操作系统镜像文件。安装过程中,重点介绍了如何选择安装路径、接受许可协议、启动安装过程,并强调了不要勾选某些选项以保持默认设置。此外,还提到了如何在虚拟机中配置网络,确保三个系统在同一网段并能互相ping通。最后,作者布置了一些练习,如熟悉操作系统的使用、获取IP地址和互相通信,以及鼓励读者享受学习网络安全的过程。
56 9
|
12天前
|
存储 Linux 虚拟化
虚拟机(vmware)中安装linux系统
虚拟机(vmware)中安装linux系统