java虚拟机学习(java虚拟机教程)

今天给各位分享java虚拟机学习的知识,其中也会对java虚拟机教程进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

1、深入理解jvm原理之逃逸分析2、《深入理解Java虚拟机》pdf下载在线阅读全文,求百度网盘云资源3、北大青鸟设计培训:为什么要学习java虚拟机的使用?4、《自己动手写Java虚拟机豆瓣》pdf下载在线阅读全文,求百度网盘云资源5、什么是Java虚拟机?6、《深入理解Java虚拟机JVM高级特性与最佳实践》epub下载在线阅读,求百度网盘云资源

深入理解jvm原理之逃逸分析

最近一直在学习Java虚拟机原理,觉得有意思的地方就写个文章记录下来。优胜劣汰是自然界的发展,适用到Java虚拟机也不为过,jvm过了生存下去,一直在自我进化,Java虚拟机也在不停的进化和优化,有的是基于执行代码的优化,例如指令重排序等等;有的是基于分析技术,例如关系分析或者逃逸分析等等,今天就重点介绍一下jvm中的分析技术优化—逃逸分析;内容大部分源自于《深入理解Java虚拟机》;

逃逸分析一般分为两种:一种基本行为就是分析对象的动态作用域,当一个对象在方法中定义后,它可能被外部的方法所引用,例如作为调用参数传入了其他对象中,称为方法逃逸;甚至被外部线程所引用,例如赋值给变量或可以在其他线程中访问的变量,这种优化行为称为线程逃逸;

概念归概念,最终效果怎么样,肯定还需要是骡子是马拉出来遛遛,总牛的理论需要落地检验,说程序员的话,也就是一个对象不会逃逸到方法或者线程之外后,这个变量会进行一些高效的优化;实现方式一般有下面几种;

栈上分配:无论是C#还是Java的程序员,大家都知道,对象会创建在Java堆上,而Java堆中的对象对线程(Java线程)是共享和可见的,而虚拟机的垃圾回收就是回收对象不再适用的对象,无论哪种垃圾回收器,都需要需要筛选和整理可回收的对象,回收和整理要耗费很长时间,如果确定一个方法不会逃逸出方法之外,那就让这个对象直接分配在栈上,而对象所占用的空间也会随着帧栈的出栈而销毁,垃圾回收系统的压力会就变的小了;

消除同步:线程同步本身就是一个相对耗时的过程(至于为什么耗时,可以查询用户线程和内核线程相关知识),如果确认一个对象不会被其他线程访问;那么变量的读写就不会和其他线程竞争,对于这种变量实施的同步可以消除;

标量替换:标量又称scalar是指一个数据已经无法再分解成更小的数据来表示了,Java虚拟机中的原始数据例如int,long,等值类型以及reference类型,都不能再进一步分解,他们就可以称为标量,相对的,它们如果可以继续分解,那就是称为聚合量又称Aggregate,Java对象就是典型的聚合量,如果把一个对象拆散,根据程序访问情况,将其使用到的成员变量类型变成基本类型代替,如果jvm逃逸分析中发现这个对象不会外部对象使用,那程序执行的就不会创建该对象,为改为创建它的若干个被这个方法使用的成员变量来代替(栈上创建的数据,又很大的概率会被jvm分配至物理机的高速寄存器中存储),这个也为后续进一步的优化创造了条件;

逃逸分析很多优势还在陆陆续续发现,Java8已经默认开启了逃逸分析, -XX:+DoEscapeAnalysis 开启或者关闭这个选项;都是干活,后续上带么和截图来验证一下;

《深入理解Java虚拟机》pdf下载在线阅读全文,求百度网盘云资源

《深入理解Java虚拟机》百度网盘pdf最新全集下载:

链接:

?pwd=ptij 提取码: ptij

简介:全书共分为五大部分,统介绍了Java的技术体系、发展历程、虚拟机家族,以及动手编译JDK,了解这部分内容能对学习JVM提供良好的指引。  

java虚拟机学习(java虚拟机教程)

北大青鸟设计培训:为什么要学习java虚拟机的使用?

随着互联网编程开发行业的不断发展,越来越多的编程开发语言被程序员所掌握。

今天,西安java培训就一起来了解一下,在学习java编程开发语言的时候,java虚拟机的存在有什么作用。

程序员之间的语言之争又未尝不是如此。

写系统语言的鄙视托管语言那低下的执行效率;写托管语言的则取笑系统语言需要手动管理内存;写动态语言的不屑于静态语言那冗余的类型系统;写静态语言的则嘲讽动态语言里边各种光怪陆离的运行时错误。

Java作为应用广的语言,自然吸引了不少的攻击,而身为Java程序员的你,或许在口水战中落了下风,忿忿于没有足够的知识武装自己;又或许想要深入学习Java语言,却又无从下手。

甚至是在实践中被Java的启动性能、内存耗费所震惊,因此对Java语言本身产生了种种的怀疑与顾虑。

不过别担心,学习Java虚拟机,就可以解答你对Java的种种疑虑,做到“知其所以然”——了解Java程序是如何被执行且优化的。

这样一来,你才可以从内部入手,达到高效编程的目的。

与此同时,你也可以为学习更深层级、更为核心的Java技术打好基础。

如果我们把核心类库的API比做数学公式的话,那么Java虚拟机的知识就好比公式的推导过程。

掌握数学公式固然可以应付考试,但是了解背后的推导过程更加有助于记忆和理解。

并且,在遇到那些没法套公式的情况下,我们也能知道如何解决。

《自己动手写Java虚拟机豆瓣》pdf下载在线阅读全文,求百度网盘云资源

《自己动手写Java虚拟机豆瓣》百度网盘pdf最新全集下载:

链接:

?pwd=tmi5 提取码:tmi5

简介:本书是继《深入理解Java虚拟机》之后的又一经典著作,它一方面遵循《Java虚拟机规范》,一方面又独辟蹊径,不仅能让Java虚拟机的学习变得更加简单和有趣,而且能让你对Java虚拟机的原理认识更深入和更深刻!

本书摒弃了传统的以解读枯燥的Java虚拟机规范文档和分析繁琐的Java虚拟机源代码的方式来讲解Java虚拟机,取而代之的是,以实践的方式,引导读者如何从零开始构建和实现一个Java虚拟机,整个过程不仅能让读者做到对Java虚拟机知其然而且知其所以然,还能屏蔽大量不必要的繁琐细节,体会到实现过程中的成就感,让学习过程更加轻松、愉悦和高效。更重要的是,这种方式能引导读者更深入地认识和掌握Java虚拟机的工作原理。  

什么是Java虚拟机?

虚拟机是一种抽象化的计算机,通过在实际的计算机上仿真模拟各种计算机功能来实现的。

Java虚拟机有自己完善的硬体架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。JVM屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。

这种解释应该算是正确的,但是只描述了虚拟机的外部行为和功能,并没有针对内部原理做出说明。一般情况下我们不需要知道虚拟机的运行原理,只要专注写java代码就可以了,这也正是虚拟机之所以存在的原因–屏蔽底层操作系统平台的不同并且减少基于原生语言开发的复杂性,使java这门语言能够跨各种平台(只要虚拟机厂商在特定平台上实现了虚拟机),并且简单易用。这些都是虚拟机的外部特性,但是从这些信息来解释虚拟机,未免太笼统了,无法让我们知道内部原理。

从进程的角度解释JVM

让我们尝试从操作系统的层面来理解虚拟机。我们知道,虚拟机是运行在操作系统之中的,那么什么东西才能在操作系统中运行呢?当然是进程,因为进程是操作系统中的执行单位。可以这样理解,当它在运行的时候,它就是一个操作系统中的进程实例,当它没有在运行时(作为可执行文件存放于文件系统中),可以把它叫做程序。

对命令行比较熟悉的同学,都知道其实一个命令对应一个可执行的二进制文件,当敲下这个命令并且回车后,就会创建一个进程,加载对应的可执行文件到进程的地址空间中,并且执行其中的指令。下面对比C语言和Java语言的HelloWorld程序来说明问题。

首先编写C语言版的HelloWorld程序。

编译C语言版的HelloWorld程序:

gcc HelloWorld.c -o HelloWorld

运行C语言版的HelloWorld程序:

zhangjg@linux:/deve/workspace/HelloWorld/src$ ./HelloWorld

hello world

gcc编译器编译后的文件直接就是可被操作系统识别的二进制可执行文件,当我们在命令行中敲下 ./HelloWorld这条命令的时候, 直接创建一个进程, 并且将可执行文件加载到进程的地址空间中, 执行文件中的指令。

作为对比, 我们看一下Java版HelloWord程序的编译和执行形式。

首先编写源文件HelloWord.java :

编译Java版的HelloWorld程序:

运行Java版的HelloWorld程序:

zhangjg@linux:/deve/workspace/HelloJava/src$ java -classpath . HelloWorld

HelloWorld

从上面的过程可以看到, 我们在运行Java版的HelloWorld程序的时候, 敲入的命令并不是 ./HelloWorld.class 。 因为class文件并不是可以直接被操作系统识别的二进制可执行文件 。 我们敲入的是java这个命令。 这个命令说明, 我们首先启动的是一个叫做java的程序, 这个java程序在运行起来之后就是一个JVM进程实例。

上面的命令执行流程是这样的:

java命令首先启动虚拟机进程,虚拟机进程成功启动后,读取参数“HelloWorld”,把他作为初始类加载到内存,对这个类进行初始化和动态链接(关于类的初始化和动态链接会在后面的博客中介绍),然后从这个类的main方法开始执行。也就是说我们的.class文件不是直接被系统加载后直接在cpu上执行的,而是被一个叫做虚拟机的进程托管的。首先必须虚拟机进程启动就绪,然后由虚拟机中的类加载器加载必要的class文件,包括jdk中的基础类(如String和Object等),然后由虚拟机进程解释class字节码指令,把这些字节码指令翻译成本机cpu能够识别的指令,才能在cpu上运行。

从这个层面上来看,在执行一个所谓的java程序的时候,真真正正在执行的是一个叫做Java虚拟机的进程,而不是我们写的一个个的class文件。这个叫做虚拟机的进程处理一些底层的操作,比如内存的分配和释放等等。我们编写的class文件只是虚拟机进程执行时需要的“原料”。这些“原料”在运行时被加载到虚拟机中,被虚拟机解释执行,以控制虚拟机实现我们java代码中所定义的一些相对高层的操作,比如创建一个文件等,可以将class文件中的信息看做对虚拟机的控制信息,也就是一种虚拟指令。

编程语言也有自己的原理, 学习一门语言, 主要是把它的原理搞明白。 看似一个简单的HelloWorld程序, 也有很多深入的内容值得剖析。

JVM体系结构简介

为了展示虚拟机进程和class文件的关系,特意画了下面一张图:

根据上图表达的内容,我们编译之后的class文件是作为Java虚拟机的原料被输入到Java虚拟机的内部的,那么具体由谁来做这一部分工作呢?其实在Java虚拟机内部,有一个叫做类加载器的子系统,这个子系统用来在运行时根据需要加载类。注意上面一句话中的“根据需要”四个字。在Java虚拟机执行过程中,只有他需要一个类的时候,才会调用类加载器来加载这个类,并不会在开始运行时加载所有的类。就像一个人,只有饿的时候才去吃饭,而不是一次把一年的饭都吃到肚子里。一般来说,虚拟机加载类的时机,在第一次使用一个新的类的时候。本专栏后面的文章会具体讨论Java中的类加载器。

由虚拟机加载的类,被加载到Java虚拟机内存中之后,虚拟机会读取并执行它里面存在的字节码指令。虚拟机中执行字节码指令的部分叫做执行引擎。就像一个人,不是把饭吃下去就完事了,还要进行消化,执行引擎就相当于人的肠胃系统。在执行的过程中还会把各个class文件动态的连接起来。关于执行引擎的具体行为和动态链接相关的内容也会在本专栏后续的文章中进行讨论。

我们知道,Java虚拟机会进行自动内存管理。具体说来就是自动释放没有用的对象,而不需要程序员编写代码来释放分配的内存。这部分工作由垃圾收集子系统负责。

从上面的论述可以知道, 一个Java虚拟机实例在运行过程中有三个子系统来保障它的正常运行,分别是类加载器子系统, 执行引擎子系统和垃圾收集子系统。 如下图所示:

虚拟机的运行,必须加载class文件,并且执行class文件中的字节码指令。它做这么多事情,必须需要自己的空间。就像人吃下去的东西首先要放在胃中。虚拟机也需要空间来存放个中数据。首先,加载的字节码,需要一个单独的内存空间来存放;一个线程的执行,也需要内存空间来维护方法的调用关系,存放方法中的数据和中间计算结果;在执行的过程中,无法避免的要创建对象,创建的对象需要一个专门的内存空间来存放。关于虚拟机运行时数据区的内容,也会出现在本专栏后续的文章中。虚拟机的运行时内存区大概可以分成下图所示的几个部分。(这里只是大概划分,并没有划分的很精细)

总结

写到这里,基本上关于我对java虚拟机的理解就写完了。这篇文章的主题虽然是深入理解Java虚拟机,但是你可能感觉一点也不“深入”,也只是泛泛而谈。我也有这样的感觉。限于自己水平有限,也只能这样了,要是想深入理解java虚拟机,强烈建议读一下三本书:

《深入Java虚拟机》

《深入理解Java虚拟机JVM高级特性与最佳实践》

《Java虚拟机规范》

其实我也读过这几本书,但是它们对虚拟机的解释也是基于一个外部模型,而没有深入剖析虚拟机内部的实现原理。虚拟机是一个大而复杂的东西,实现虚拟机的人都是大牛级别的,如果不是参与过虚拟机的实现,应该很少有人能把它参透。本专栏后面的一些文章也参考了这三本书, 虽然讲解Java语法的书不计其数, 但是深入讲解虚拟机的书, 目前为止我就见过这三本,并且网上的资料也不是很多。

最后做一个总结:

1 虚拟机并不神秘,在操作系统的角度看来,它只是一个普通进程。

2 这个叫做虚拟机的进程比较特殊,它能够加载我们编写的class文件。如果把JVM比作一个人,那么class文件就是我们吃的食物。

3 加载class文件的是一个叫做类加载器的子系统。就好比我们的嘴巴,把食物吃到肚子里。

4 虚拟机中的执行引擎用来执行class文件中的字节码指令。就好比我们的肠胃,对吃进去的食物进行消化。

5 虚拟机在执行过程中,要分配内存创建对象。当这些对象过时无用了,必须要自动清理这些无用的对象。清理对象回收内存的任务由垃圾收集器负责。就好比人吃进去的食物,在消化之后,必须把废物排出体外,腾出空间可以在下次饿的时候吃饭并消化食物。

扩展资料:

关于JAVA虚拟机的参数说明如下:

1、运行class文件

执行带main方法的class文件,Java虚拟机[3] 命令参数行为:

java CLASS文件名

注意:CLASS文件名不要带文件后缀.class

例如:

java Test

如果执行的class文件是带包的,即在类文件中使用了:

package ;包名

那应该在包的基路径下执行,Java虚拟机命令行参数:

java ;包名.CLASS文件名

例如:

PackageTest.java中,其包名为:com.ee2ee.test,对应的语句为:

package com.ee2ee.test;

PackageTest.java及编译后的class文件PackageTest.class的存放目录如下:

classes

|__com

|__ee2ee

|__test

|__PackageTest.java

|__PackageTest.class

要运行PackageTest.class,应在classes目录下执行:

java com.ee2ee.test.PackageTest

2、运行jar文件中的class

原理和运行class文件一样,只需加上参数-cp jar文件名;即可。

例如:执行test.jar中的类com.ee2ee.test.PackageTest,命令行如下:

java -cp test.jar com.ee2ee.test.PackageTest

3、显示JDK版本信息

当一台机器上有多个jdk版本时,需要知道当前使用的是那个版本的jdk,使用参数-version即可知道其版本,命令行为:

java -version

4、增加虚拟机可以使用的最大内存

Java虚拟机可使用的最大内存是有限制的,缺省值通常为64MB或128MB。

如果一个应用程序为了提高性能而把数据加载内存中而占用较大的内存,比如超过了默认的最大值128MB,需要加大java虚拟机可使用的最大内存,否则会出现Out of Memory的异常。启动java时,需要使用如下两个参数:

-Xms java虚拟机初始化时使用的内存大小

-Xmx java虚拟机可以使用的最大内存

以上两个命令行参数中设置的size,可以带单位,例如:256m表示256MB

举例说明:

java -Xms128m -Xmx256m …

表示Java虚拟机初始化时使用的内存为128MB,可使用的最大内存为256MB。

对于tomcat,可以修改其脚本catalina. sh(Unix平台)或catalina.bat(Windows平台),设置变量JAVA_OPTS即可,例如:

JAVA_OPTS=’-Xms128m -Xmx256m’

参考资料:百度百科-java虚拟机

《深入理解Java虚拟机JVM高级特性与最佳实践》epub下载在线阅读,求百度网盘云资源

《深入理解Java虚拟机(第3版)》(周志明)电子书网盘下载免费在线阅读

链接:

密码:l7ai  

书名:深入理解Java虚拟机(第3版)

作者:周志明

豆瓣评分:9.5

出版社:机械工业出版社

出版年份:2019-12

页数:540

内容简介:

内容介绍

这是一部从工作原理和工程实践两个维度深入剖析JVM的著作,是计算机领域公认的经典,繁体版在台湾也颇受欢迎。

自2011年上市以来,前两个版本累计印刷36次,销量超过30万册,两家主要网络书店的评论近90000条,内容上近乎零差评,是原创计算机图书领域不可逾越的丰碑。

第3版在第2版的基础上做了重大修订,内容更丰富、实战性更强:根据新版JDK对内容进行了全方位的修订和升级,围绕新技术和生产实践新增逾10万字,包含近50%的全新内容,并对第2版中含糊、瑕疵和错误内容进行了修正。

作者简介:

资深Java技术、机器学习和企业级开发技术专家,现任远光软件研究院院长,人工智能博士在读,著有知名畅销书《深入理解Java虚拟机:JVM高级特性与最佳实践》。

开源技术的积极倡导者和推动者,对计算机科学和相关的多个领域都有深刻的见解,尤其是人工智能、Java开发和敏捷开发等领域。曾受邀在InfoQ和IBM DeveloperWorks等网站撰写技术专栏。

关于java虚拟机学习和java虚拟机教程的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

本文来自投稿,不代表【】观点,发布者:【

本文地址: ,如若转载,请注明出处!

举报投诉邮箱:253000106@qq.com

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2024年4月1日 07:40:38
下一篇 2024年4月1日 07:51:08

相关推荐

  • js和java的区别,js java 区别

    有人知道这个Java和js有什么区别吗?两个都是可以用来软件开发的吗? 1、javascript和java有什么区别:基于对象和面向对象:java是一真正意义上面向对象的语言,包括了开发简单的程序或者是必须设计的对象。javascript则是脚本语言,可以用来制作和网络无关的和用户交互左右的软件。 2、运行环境不同:Java是一种编译性语言,它的代码需要在J…

    2024年5月18日
    3500
  • java多线程异常处理,java多线程yield

    关于java多线程的… 1、在 Java 中,线程(Thread)是指程序执行的一条路径,是进程中的一个实体。Java 中的线程是轻量级的,可以同时运行多个线程,这就是多线程(Multithreading)。 2、有其他线程的notify方法来唤醒线程 有其他线程的notifyAll方法来唤醒线程 有其他线程的interrupt方法来唤醒线程 w…

    2024年5月18日
    7700
  • javajsonlib下载,java download

    Java解析json数据 检查JSON数据格式是否正确。可以使用在线JSON格式验证工具或者JSON编辑器等工具对返回的JSON数据进行检验,确保JSON数据的格式符合标准格式要求。检查JSON数据中的键值对是否匹配。 java解析json字符串时将大括号中的对应为一个类,里面的数据对应为类的属性,最后用数组接受即可。 所以当从webservice解析数据时…

    2024年5月18日
    6100
  • .netjava混合,java混合模式

    Java能和.net混合使用吗 1、可以的。并不冲突 。net 用的是 iis 而java用的是jdk, tomcat或者是别的高级的容器。而且可以安装多个jdk。 2、可以的,你可以将服务器做成虚拟化,然后生成两个虚拟机(理论可以有很多个,只要资源充足),然后每个虚拟机安装一个环境即可。 3、当然可以。 本人学点JAVa,双去学.net,觉得理解不深刻,又…

    2024年5月18日
    5600
  • java打包工具,java打包app

    如何用JAVA把内存里的二进制文件打包成ZIP包 1、首先要安装压缩软件,现在比较流行的是WinRAR「一种高效快速的文件压缩软件(中文版)」。 求Java程序打包成可执行jar的工具或者方法 1、在将应用程序下载到设备上时,将先下载和读取描述符,然后再下载和读取包含MIDP应用程序的JAR文件。在装入MIDlet套件的完整JAR文件之前,移动设备上的应用程…

    2024年5月18日
    3300
  • java如何比较两个对象是否相等,java怎么比较两个对象

    jAVA对象的比较 在Java语言中,主要可以利用==运算符(两个等号)和equal函数来对对象进行比较。 忽略模板的情况,需要实现 java.lang.Comparable 并实现int compareTo (Object o)这个方法表示当前对象(this)和o对象比较的结果。 使用对象本身的equals进行比较,equals首先会进行 == 比较,然后…

    2024年5月18日
    3700
  • linuxjava安装,linux yum安装java

    如何在linux下安装java Java安装之Java环境安装 从sun主页下载JDK for Linux版本。这里下载的是jdk-6u6-linux-i58bin。 用root用户登录ubuntu,或是在普通用户下用su命令切换用户。切换到所需的安装目录。 Linux下安装Java环境配置步骤详述 下载jdk8 登录网址:http:// 选择对应jdk版本…

    2024年5月18日
    4000
  • javapdf签名认证,java实现签名apk

    怎样取消pdf中签名验证 如果只是一次性禁用驱动程序的认证签名,可以在开机时按F8键,在弹出的菜单中有禁用驱动程序签名强制 选项,使用上下键选中之后,再按回车键确认,进入系统即可使用自己的驱动程序更新设备的驱动程序了。 首先在AdobeAcrobat软件中,打开一个pdf的文件,点击AdobeAcrobat的菜单中的高级。其次弹出了下拉菜单,选中为签名和验证…

    2024年5月18日
    3100
  • java打开就关闭了,java点开之后闪退什么情况

    java一打开后马上就被关闭了。 降低 Java 安全级别:打开 Java 控制面板,选择“安全”选项卡,将安全级别降低到“中”或“低”水平。请注意,这可能会增加计算机的安全风险。因此,建议在完成打印操作后,将 Java 安全级别恢复到原来的设置。 java的编程界面是要另外下载的,如netbeans, eclipse,jcreator等。实际上java无需…

    2024年5月18日
    4800
  • java分布式公共代码,java 分布式编程

    JAVA入门教程什么好? 《Java编程思想》在有了一定的Java编程经验之后,你需要“知其所以然”了。 学习web开发:学习全面的web开发知识,比如Servlet JSP、javaBean、TagLib等。学习开源框架:学习较为流行和实用的开源框架,比如:Struts、Spring、Webwork等。 Java编程语言,即语法。Java文件格式,即各种文…

    2024年5月18日
    3000

发表回复

登录后才能评论



关注微信