java工作原理?

2021-01-21 09:36发布

11条回答
studentaaa
2楼 · 2021-01-21 15:33

在研究Java运行原理之前,我们先把视野放宽一点:一般的高级语言是如何工作的?我们在编辑器或者IDE里根据每种语言的语法规则敲入源代码,这些代码我们很容易理解。很显然,这些代码肯定是以二进制存储在我们的硬盘当中,当我们再次打开的时候,编辑器读取这些二进制,还原成我们能读懂的英文。当我们真正运行程序的时候,CPU是读不懂这些英文的,所以我们需要先转化成可执行的二进制文件,这个过程通常由编译器完成。有些编译器直接将源代码编译成机器码,载入内存后CPU可以直接运行。而机器码的格式是跟具体的CPU架构相关的,Intel的CPU机器码对于ARM CPU来说是无法理解的。因此,同样的源代码需要根据不同的硬件进行特定的编译。好了,高级语言到低级语言的桥梁就是编译器。我们写好源代码,编译器将源码编译成可执行的机器码,然后CPU读取机器码,执行程序。


可以说,Java这一语言的执行过程也遵循这样的过程:源代码--->机器码。 但是,从源代码到机器码之间,究竟经过什么样的过程,则是Java独一无二的了。宽泛地讲,Java源代码(.java)经过java编译器(javac.exe)编译之后,并没有直接转化为机器码,而是转化成一种中间格式,成为字节码(.class),字节码再经过java虚拟机转化成特定CPU架构的机器码。也正是因为这一中间物,java才有所谓的跨平台。在windows平台上编译好的字节码,copy到linux平台后,经过为linux而设计的Java虚拟机解释后即可执行。跨平台这一特征,是通过字节码和JVM来实现的。因此,想搞清楚java程序到底是如何运行的,重点在于弄明白字节码是如何被转化成跟CPU架构相关的机器码然后被执行的。也就是要理解JVM到底是如何工作的。


在了解JVM之前,我们再跳出来一下,先看看什么是虚拟机。所谓虚拟机,我是这么理解的:用软件的方式模拟出跟硬件类似的环境,比如说寄存器、存储器等等。当然,所有最终的工作还是由原来的CPU来完成。比如说VirtualBox这个虚拟机产品,它其实就是一个应用程序,用某种编程语言编写的应用程序。当运行这个应用程序时,它会要求操作系统给它独立施展手脚的空间:给我一些内存,给我一定的CPU时间片,然后不用管我了。你可能会问,寄存器是硬件啊,它怎么能划分啊,难道是时间划分?不是的,像内存这样的硬件,可以给虚拟机一块独立的内存块,但是寄存器之后的,则需要用“模拟仿真”的方式来模拟。OK,回到Java虚拟机。到底什么是Java虚拟机,很难有一个十分明确的定义,狭窄一点说,它就是一个应用程序,大部分用C++编写的。宽泛地说,它就是执行字节码的一整个环境。


小橘子
3楼 · 2021-01-21 16:07

  Java这一语言的执行过程也遵循这样的过程:源代码--->机器码。 但是,从源代码到机器码之间,究竟经过什么样的过程,则是Java独一无二的了。宽泛地讲,Java源代码(.java)经过java编译器(javac.exe)编译之后,并没有直接转化为机器码,而是转化成一种中间格式,成为字节码(.class),字节码再经过java虚拟机转化成特定CPU架构的机器码。也正是因为这一中间物,java才有所谓的跨平台。在windows平台上编译好的字节码,copy到linux平台后,经过为linux而设计的Java虚拟机解释后即可执行。跨平台这一特征,是通过字节码和JVM来实现的。因此,想搞清楚java程序到底是如何运行的,重点在于弄明白字节码是如何被转化成跟CPU架构相关的机器码然后被执行的。也就是要理解JVM到底是如何工作的。


一碗馄饨皮儿
4楼 · 2021-01-21 16:32

1、java虚拟机

Java虚拟机其实是软件模拟的计算机,它可以在任何处理器上解释并执行字Java的字节码文件。Java的字节码被称为Java虚拟机的机器码,它被保存在扩展名为.class的文件中。

首先Java源程序需要通过Java编译器编译成扩展名为.class的字节码文件,然后由Java虚拟机中的Java解释器负责将字节码文件解释成为特定的机器码并执行。


2、内存自动回收机制

在程序的执行过程中,系统会给创建的对象分配内存,当这些对象不再被引用时,它们所占用的内存会处于废弃状态,如果不及时对这些废弃的内存进行回收,就会带来程序运行效率下降等问题。

在Java运行环境中,始终存在着一个系统级的线程,专门跟踪对象的使用情况,定期检测出不再使用的对象,自动回收它们占用的内存空间,并重新分配这些内存空间让它们为程序所用。Java的这种废弃内存自动回收机制,能够在编写程序时不需要考虑对象的内存分配问题。


3、代码安全性检查机制

Java是网络编程语言,在网络上运行的程序必须保证其安全性。如何保证从网络上下载的Java程序不携带病毒而安全地执行呢?Java提供了代码安全性检查机制。

Java在将一个扩展名为 .class的字节码文件装载到虚拟机执行之前,先要检验该字节码文件是否符合字节码文件规范,代码中是否存在着某些非法操作。检验工作由字节码检验器或安全管理器进行。检验通过之后,将字节码文件加载到Java虚拟机中,由Java解释器解释为机器码并执行。java虚拟机把程序的代码和数据都限制在一定内存空间里执行,不允许程序访问超出该范围,保证了程序的安全运行。


大冬瓜
5楼 · 2021-01-22 10:51

编译型语言  VS  解释性语言:

编译型语言是通过专门的编译器,将高级语言【一次性翻译成】可被平台(如OS操作系统)执行的机器码,编译一次,脱离开发环境可独立运行,故效率高;但对编译器严重依赖,而不同操作系统所使用的编译器是各不相同的,所以造成了编译型语言可移植性差的特点。

同样的,解释型语言也有专门的解释器,将原程序解释成特定的平台可执行文件,不同的是,解释型语言不会进行整体的编译,而是把编译和解释混合在一起执行。但解释性语言跨平台性好,只需通过不同的解释器,将其解释成某平台可识别的指令即可。这是编译的过程无法做到的。


啦啦啦
6楼 · 2021-01-22 11:03

1、java虚拟机

Java虚拟机其实是软件模拟的计算机,它可以在任何处理器上解释并执行字Java的字节码文件。Java的字节码被称为Java虚拟机的机器码,它被保存在扩展名为.class的文件中。

首先Java源程序需要通过Java编译器编译成扩展名为.class的字节码文件,然后由Java虚拟机中的Java解释器负责将字节码文件解释成为特定的机器码并执行。

2、内存自动回收机制

在程序的执行过程中,系统会给创建的对象分配内存,当这些对象不再被引用时,它们所占用的内存会处于废弃状态,如果不及时对这些废弃的内存进行回收,就会带来程序运行效率下降等问题。

在Java运行环境中,始终存在着一个系统级的线程,专门跟踪对象的使用情况,定期检测出不再使用的对象,自动回收它们占用的内存空间,并重新分配这些内存空间让它们为程序所用。Java的这种废弃内存自动回收机制,能够在编写程序时不需要考虑对象的内存分配问题。

3、代码安全性检查机制

Java是网络编程语言,在网络上运行的程序必须保证其安全性。如何保证从网络上下载的Java程序不携带病毒而安全地执行呢?Java提供了代码安全性检查机制。

Java在将一个扩展名为 .class的字节码文件装载到虚拟机执行之前,先要检验该字节码文件是否符合字节码文件规范,代码中是否存在着某些非法操作。检验工作由字节码检验器或安全管理器进行。检验通过之后,将字节码文件加载到Java虚拟机中,由Java解释器解释为机器码并执行。java虚拟机把程序的代码和数据都限制在一定内存空间里执行,不允许程序访问超出该范围,保证了程序的安全运行。


寂静的枫林
7楼 · 2021-01-22 11:48

 Java这一语言的执行过程也遵循这样的过程:源代码--->机器码。 但是,从源代码到机器码之间,究竟经过什么样的过程,则是Java独一无二的了。宽泛地讲,Java源代码(.java)经过java编译器(javac.exe)编译之后,并没有直接转化为机器码,而是转化成一种中间格式,成为字节码(.class),字节码再经过java虚拟机转化成特定CPU架构的机器码。也正是因为这一中间物,java才有所谓的跨平台。在windows平台上编译好的字节码,copy到linux平台后,经过为linux而设计的Java虚拟机解释后即可执行。跨平台这一特征,是通过字节码和JVM来实现的。因此,想搞清楚java程序到底是如何运行的,重点在于弄明白字节码是如何被转化成跟CPU架构相关的机器码然后被执行的。也就是要理解JVM到底是如何工作的。

梦到内河_
8楼 · 2021-01-22 16:55

Java这一语言的执行过程也遵循这样的过程:源代码--->机器码。 但是,从源代码到机器码之间,究竟经过什么样的过程,则是Java独一无二的了。宽泛地讲,Java源代码(.java)经过java编译器(javac.exe)编译之后,并没有直接转化为机器码,而是转化成一种中间格式,成为字节码(.class),字节码再经过java虚拟机转化成特定CPU架构的机器码。也正是因为这一中间物,java才有所谓的跨平台。在windows平台上编译好的字节码,copy到linux平台后,经过为linux而设计的Java虚拟机解释后即可执行。跨平台这一特征,是通过字节码和JVM来实现的。因此,想搞清楚java程序到底是如何运行的,重点在于弄明白字节码是如何被转化成跟CPU架构相关的机器码然后被执行的。也就是要理解JVM到底是如何工作的。

李龙鑫
9楼 · 2021-01-25 15:14

这里我们简单分析一下我们的第一个应用程序,其中涉及到很多没有接触过的概念,大家可先阅读以下,以后会详细讲解。重点是理解java的运行原理。

一、分析程序

1、符号 /* */ 指示中间的语句是该程序中的注释。多行注释以 /* 开始,以 */ 结束。单行注释以 // 开始,以行末结束

java文档注释使用/** */。

2、关键字 class 声明类的定义,还帮助编译器理解它是一个类的声明。

3、整个类及其所有成员都是在一对大括号中(即 { 和 } 之间)定义的。它们标志着类定义块的开始和结束。

4、程序从 main( ) 方法开始执行。

5、关键字 public 是一个访问说明符,控制类成员的可见度和作用域。

6、关键字 static 允许调用 main( ) 方法,而无需创建类的实例。

7、关键字 void 告诉编译器 main( ) 方法在执行时不返回任何值。

8、main( )方法是所有Java 应用程序的起始点。

9、args[ ]是String类型的数组。

10、println( )方法通过 System.out 显示作为参数传递给它的字符串。

二、运行原理

1、java虚拟机JVM。JVM是java语言最大的特点,java的优缺点也是缘于JVM技术。JVM是一个可运行Java字节码的虚拟计算机系统。它有一个解释器组件,可以实现Java字节码和计算机操作系统之间的通信。还包括一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域。 JVM屏蔽了与具体操作系统平台相关的信息,使Java程序只需生成在Java虚拟机上运行的字节码,就可以在多种平台上不加修改地运行。这个也是java最大的特色跨平台性,也就是一处编写,处处运行。JVM在执行字节码时,实际上最终还是把字节码解释成具体平台上的机器指令执行。编译虚拟机的指令集与编译微处理器的指令集非常类似。这就是java最受人批评的一个地方,运行在JVM上面当然没有直接运行在操作系统上快。所以有人总是说java的运行速度比不上C语言。

2、java程序的运行原理。


三、常见的问题

1、javac不是内部命令 或者可执行文件

在DOC命令下,可以运行Java命令,但是在编译源代码时却不能运行javac命令,并提示“javac不是内部命令 或者可执行文件”,出现这种情况一般是由于Path的环境变量的路径有问题。因为我们输入的任何命令,操作系统都会根据Path设定的路径去找这些命令,如果找不到就会出现这个错误,特别注意的是最后的分号要写上。

3、语法错误。例如:类名和文件名不一致,英文关键字的大小写问题没有注意。还得注意标点符号不能使用中文符等。

4、java命令不能运行class

javac能正常编译,但是在输入 java helloWorld运行是去报出了下面一行代码提示。

“Exception in thread "main" java.lang.NoClassDefFoundError: Hello World”提示

根据提示,意思是找不到class文件。这个问题应该就是是classpath环境变量配置不对,检查你的classpath的设置,注意一些特殊的符号。然后重启DOS再试一次。


发送你要查询的内容的编号给我!我将为你解答!例如发送:1.1

第一天、java开发环境的搭建和第一个java程序的运行:

1.1jdk的安装

1.2第一个java程序——hello world

1.3java的运行原理

1.4集成开发环境(IDE)介绍

第二天、变量、数据类型和运算符:

2.1变量的声明和数据类型

2.2基本数据类型的变量

2.3Java的表达式和运算符

2.4运算符的优先级别

第三天、程序流程控制:

3.1条件判断

3.2循环结构

3.3多重循环和break、continue语句

3.4数组

第四天、面向对象(1):

4.1面向对象的基本概念

4.2属性和普通方法

4.3构造方法

4.4包

第五天、面向对象(2):

5.1继承

5.2多态

5.3访问修饰符

5.4static和final修饰符

第六天、面向对象(3):

6.1abstract抽象类

6.2接口

6.3问题总结;值传参,对象作为参数时的值传参

第七天、字符串(String)对象和数学(Math)对象:

7.1String字符串

7.2StringBuffer和StringBuilder

7.3Math类

第八天、java的异常处理:

8.1异常的基本概念和处理流程

8.2各种常见的异常

8.3异常的嵌套和级联

8.4自定义异常和throw、throws的使用。

第九天、java的工具(Util)包(1):

9.1Date类

9.2Calendar类

9.3Random随机数类

9.4ArrayList

9.5LinkedList

第十天、java的工具(Util)包(2):

10.1Set接口,HashSet实现

10.2TreeSet介绍

10.3Map接口和HashMap实现

10.4properties属性文件

第十一天、java的输入/输出(IO)包(1):

11.1File文件的基本操作

11.2字节流

11.3字符流

第十二天、java的输入/输出(IO)包(2):

12.1带缓冲的流

12.2datainputstream和dataoutputstream

12.3randomaccessfile

第十三天、java的输入/输出(IO)包(3):

13.1serializable序列化

13.2压缩与解压(1)

13.3压缩与解压(2)

第十四天、线程:

14.1线程概念和两种实现方法

14.2线程示例和传参问题

14.3线程的同步

14.4死锁

第十五天、swing的简单介绍:

15.1swing的入门

15.2实例讲解

15.3控件、事件处理和布局介绍

15.4弹出框和多个窗口之间的切换

第十六天、网络编程——socket的认识:

16.1网络相关理论基础

16.2URL类统一资源定位和Inetaddress类简介

16.3socket的通讯

16.4使用多线程监听多客户端

第十七天、多人聊天系统:

17.1项目概述和界面设计

17.2服务器端的实现

17.3客户端实现


相关问题推荐

  • 回答 2

    Statement的execute(String query)方法用来执行任意的SQL查询,如果查询的结果是一个ResultSet,这个方法就返回true。如果结果不是ResultSet,比如insert或者update查询,它就会返回false。我们可以通过它的getResultSet方法来获取ResultSet,或者通过getUpda...

  • 回答 22

    忙的时候项目期肯定要加班 但是每天加班应该还不至于

  • 回答 108
    已采纳

    虽然Java人才越来越多,但是人才缺口也是很大的,我国对JAVA工程师的需求是所有软件工程师当中需求大的,达到全部需求量的60%-70%,所以Java市场在短时间内不可能饱和。其次,Java市场不断变化,人才需求也会不断增加。马云说过,未来的制造业要的不是石油,...

  • 回答 5
    已采纳

    工信部证书含金量较高。工信部是国务院的下属结构,具有发放资质、证书的资格。其所发放的证书具有较强的权威性,在全国范围内收到认可,含金量通常都比较高。 工信部证书,其含义也就是工信部颁发并承认的某项技能证书,是具有法律效力的,并且是国家认可的...

  • 回答 70
    已采纳

    学Java好不好找工作?看学完Java后能做些什么吧。一、大数据技术Hadoop以及其他大数据处理技术都是用Java或者其他,例如Apache的基于Java 的 HBase和Accumulo以及ElasticSearchas。但是Java在此领域并未占太大空间,但只要Hadoop和ElasticSearchas能够成长壮...

  • 回答 16
    已采纳

    就是java的基础知识啊,比如Java 集合框架;Java 多线程;线程的五种状态;Java 虚拟机;MySQL (InnoDB);Spring 相关;计算机网络;MQ 消息队列诸如此类

  • 回答 12

    #{}和${}这两个语法是为了动态传递参数而存在的,是Mybatis实现动态SQL的基础,总体上他们的作用是一致的(为了动态传参),但是在编译过程、是否自动加单引号、安全性、使用场景等方面有很多不同,下面详细比较两者间的区别:1.#{} 是 占位符 :动态解析 ...

  • 回答 62

    没问题的,专科学历也能学习Java开发的,主要看自己感不感兴趣,只要认真学,市面上的培训机构不少都是零基础课程,能跟得上,或是自己先找些资料学习一下。

  • 回答 4

    1、反射对单例模式的破坏采用反射的方式另辟蹊径实例了该类,导致程序中会存在不止一个实例。解决方案其思想就是采用一个全局变量,来标记是否已经实例化过了,如果已经实例化过了,第 二次实例化的时候,抛出异常2、clone()对单例模式的破坏当需要实现单例的...

  • 回答 5

     优点: 一、实例控制  单例模式会阻止其他对象实例化其自己的单例对象的副本,从而确保所有对象都访问唯一实例。 二、灵活性  因为类控制了实例化过程,所以类可以灵活更改实例化过程。 缺点: 一、开销  虽然数量很少,但如果每次对象请求引用时都要...

  • 回答 4

    这个主要是看你数组的长度是多少, 比如之前写过的一个程序有个数组存的是各个客户端的ip地址:string clientIp[4]={XXX, xxx, xxx, xxx};这个时候如果想把hash值对应到上面四个地址的话,就应该对4取余,这个时候p就应该为4...

  • 回答 6

     哈希表的大小 · 关键字的分布情况 · 记录的查找频率 1.直接寻址法:取关键字或关键字的某个线性函数值为散列地址。即H(key)=key或H(key) = a·key + b,其中a和b为常数(这种散列函数叫做自身函数)。...

  • 回答 6

    哈希表的大小取决于一组质数,原因是在hash函数中,你要用这些质数来做模运算(%)。而分析发现,如果不是用质数来做模运算的话,很多生活中的数据分布,会集中在某些点上。所以这里最后采用了质数做模的除数。 因为用质数做了模的除数,自然存储空间的大小也用质数了...

  • 回答 2

    是啊,哈希函数的设计至关重要,好的哈希函数会尽可能地保证计算简单和散列地址分布均匀,但是,我们需要清楚的是,数组是一块连续的固定长度的内存空间

  • 回答 3

     解码查表优化算法,seo优化

  • 回答 5

    1.对对象元素中的关键字(对象中的特有数据),进行哈希算法的运算,并得出一个具体的算法值,这个值 称为哈希值。2.哈希值就是这个元素的位置。3.如果哈希值出现冲突,再次判断这个关键字对应的对象是否相同。如果对象相同,就不存储,因为元素重复。如果对象不同,就...

没有解决我的问题,去提问