java工作原理?_第2页回答

2021-01-21 09:36发布

11条回答
慕容
2楼 · 2021-02-25 11:31

1java虚拟机

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

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


2内存自动回收机制

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

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


3代码安全性检查机制

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

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

我的网名不再改
3楼 · 2021-05-14 16:40

在Java中引入了虚拟机的概念,即在机器和编译程序之间加入了一层抽象的虚拟的机器。这台虚拟的机器在任何平台上都提供给编译程序一个的共同的接口。编译程序只需要面向虚拟机,生成虚拟机能够理解的代码,然后由解释器来将虚拟机代码转换为特定系统的机器码执行。在Java中,这种供虚拟机理解的代码叫做字节码(ByteCode)(class文件的内容),它不面向任何特定的处理器,只面向虚拟机。每一种平台的解释器是不同的,但是实现的虚拟机是相同的。Java源程序经过编译器编译后变成字节码,字节码由虚拟机解释执行,虚拟机将每一条要执行的字节码送给解释器,解释器将其翻译成特定机器上的机器码,然后在特定的机器上运行。


跨平台:


话说,在北京,一般都是讲北京话的,上海,一般都是将上海话,广东,广东话...


现有一公文发出,要全国执行,该当如何?——先统一翻译成普通话。各地在将普通话版本翻译成当地的方言。


这里,北京、上海就是不同类型的机器windows,linux...


编译(javac)就是将公文翻译成普通话的过程,而编译出的.class文件,就是公文的普通话版本。


在执行的时候,各地的翻译就是jvm,负责将.class转换成本地能够理解的方言来执行。


*.java→*.class→机器码


java编译器 (编译) → 虚拟机(解释执行) → 解释器(翻译) → 机器码


Java虚拟机(JVM)


Java虚拟机(JVM)是Java Virtual Machine的缩写,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能模拟来实现的。


Java中,类加载器把一个类装入JAVA虚拟机需要经过三个步骤来完成:装载、链接、初始化,其中链接又分来校验、准备、解析过程


装载:查找和导入.class文件


链接:检查装入.class文件的正确性,然后,java虚拟机为变量分配内存,设置默认值


初始化:把符号引用变成直接引用。。。




View Code


1 public classMain {2


3 private static int size=1;4


5 public static voidmain(String args[]) {6


7 User u = newUser();8


9 u.setName("李文水");10


11 u.setPwd("159");12


13 String name =u.getName();14


15 String pwd =u.getPwd();16


17 u = null;18


19 }20


21 }22


23 public classUser {24


25 privateString name;26


27 privateString pwd;28


29 publicString getName() {30


31 returnname;32


33 }34


35 public voidsetName(String name) {36


37 this.name =name;38


39 }40


41 publicString getPwd() {42


43 returnpwd;44


45 }46


47 public voidsetPwd(String pwd) {48


49 this.pwd =pwd;50


51 }52


53 }


现在假设这两个java源文件已经被编译成了CLASS文件了,我们来看看java虚拟机怎么执行的。


Java虚拟机工作流程:


1.装载


描叙:Java虚拟机装载指定的CLASS文件


结果:形成这个CLASS类的实例对象


过程:java虚拟机使用类装载器定位到相应的CLASS文件,然后读取这个CLASS文件(一个线性二进制数据流),将它传入java虚拟机中。紧接着虚拟机提取其中的类型信息。比如:该类的类名,方法名,变量名,修饰符,方法的返回类型等等。还有一个重要的东西就是常量池。(常量池保存了该类型的所有常量,包括直接常量和对其他类型,字段,方法的符号引用)将这些信息保存在一个叫做方法区的地方。最终形成CLASS类的实例,这个实例存放在内存的堆区。它成为了java程序与内部数据结构之间的接口,程序要访问该类型的信息,程序就调用该类型对应的CLASS实例对象的方法。简而言之:这个过程就是把一个类型的二进制数据解析为方法区中的内部数据结构,并在堆上建立一个CLASS对象的过程。


示例:装载Main类


Java虚拟机读取Main类的CLASS文件,生产对应的java.lang.Class类的实例,读取其中的类型信息,比如修饰符 private,public,static,另外变量 size,name,pwd,User(User即为一个引用)共同构成了这个类的常量池。将这些信息保存在方法区,


2.链接


描述:验证,准备,解析(可选)


结果:这个类型是正确的。(这里不知道该怎么描述)


过程:


1)验证:确定类型符合java语言的语义,比如:final类不能有子类,final方法不能被覆盖,确保在类型和超类型之间没有不兼容的方法声明(比如两个方法拥有同样的名字,参数完全相同,但返回类型不同)。


2)准备:java虚拟机为类变量分配内存,设置默认值


3)解析:在类型的常量池中寻找类,接口,字段和方法的符合引用把这些符号引用替换成直接引用的过程。


示例: 连接Main类


Java虚拟机为size分配内存,并赋默认值0.找到常量池中User类的引用,如果User类还没有被装载,则装载并且连接该类,然后将常量池中对User类的引用替换为直接引用。在此时User类并不会被初始化,因为还没有用它。


3.初始化


描述:初始化一些静态变量


结果:这个类型可以使用了


过程:可能会调用()方法,(这个方法只能够由java虚拟机调用)来初始化该类的静态变量。在调用这个方法前,必须确认该类的超类的() 方法已经被调用。


示例:初始化Main类


Java虚拟机将Main类的静态变量赋值为1.


4.使用(执行该类代码了)


1.User u = new User();(存放在内存的堆区)


创建了一个User类实例,实际上是通过这个类的CLASS实例实例化的。方法如下:


User u=(User)Class.forName("User").newInstance();


为了方便,用C代替Class.forName("User")


2.u.setName("李文水"); u.setPwd("159");


调用该类的方法,为该类的变量赋值,Java虚拟机内部调用是这样的,通过方法区找到该方法,利用CLASS实例的如下方法调用:


c.getMethod("setName").invoke(u,"李文水");


3.String name = u.getName(); String pwd = u.getPwd();


与第二步类似,不同的是将取得的值分别赋给了变量name和pwd。关键是这个值保存在哪里?和实例对象一样,存放在堆区。这个时候我应该可以看出CLASS实例的作用了,它就是起个中间作用,将程序中的调用反应到堆区上数据的变化。


4.u = null;


这个步骤写出来的目的是了解一下Java虚拟机垃圾回收机制。(没有什么实际意义)


Java虚拟机内部会根据一种规则(这个对象是否可以触及)来判断这两个类是否可以回收了?具体形式如下:


当执行 u = null;时这条线就被斩断了,因此User实例就不可以触及了,所以java虚拟机就可以回收这个User实例了


lucky璐呀
4楼 · 2021-12-29 09:14

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

相关问题推荐

  • 回答 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.如果哈希值出现冲突,再次判断这个关键字对应的对象是否相同。如果对象相同,就不存储,因为元素重复。如果对象不同,就...

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