精华内容
下载资源
问答
  • java虚拟机原理

    2018-09-14 20:30:04
    Car c=new Car() 能否解释一下上面代码在内存中是如何分配的? 在JVM栈区当中的一个新生代区里面的一个伊甸园区 java源程序(a.java)-&...(3)能直接解释java字节码的cpu class files-> clas...
    Car c=new Car()
    能否解释一下上面代码在内存中是如何分配的?
    在JVM栈区当中的一个新生代区里面的一个伊甸园区
    
    
    
    java源程序(a.java)->编译成java的二进制字节码(a.class)
    (1) Windows下的JAVA字节码解释程序
    (2)Linux下的java字节码解释程序
    (3)能直接解释java字节码的cpu
    
    class files-> class loader-> | runtime data area (method area,java stack,native method stack ,heap,program counter register)|->execution engine->native-interface -native libraries
    
    
    一、能否介绍一下JVM 的体系结构:
    JVM体系结构:字节码文件-有类加载器加载 ,通过类加载器加载过来之后交给运行时空间(运行时空间里面凤城好多块:首先有一个方法区,2,有一个堆区,3还有一个java栈区,本地方法栈区,PC寄存器)-执行引擎-调用本地接口-libraries资源库
    
    二、能否介绍一下类加载器:应用加载器,根加载器,扩展加载器(Class.forName("com.gao.Hello"))
      
      classload 分为三个类加载器  :1.根加载器(bootstrap)2.(应用加载器 AppClassLoader)
      3.(扩展加载器,ExtClassLoader)
     类加载器 ClassLoader
     负责加载class文件,class文件在文件开头有特定的文件提示,并且CLassLoader只负责class文件的的加载,至于是否可以运行,则有Execution Engine负责
    
     JVM 中双亲委派机制;
     java中的沙箱模型
     三、JNI(java native interface) 由于java不能直接去访问底层(操作系统),所以要是用JNI去操作或者访问底层,JNI换句话说就是访问java 和操作系统之间的桥梁
     四、栈:存放的都是基本数据类型,和一些引用类型
     
     五、方法区:方法区是线程共享的,通常用来保存状态类的原结构信息。
     eg:运行时常量池,静态变量 常量,字段,方法字节码,在类、实例、接口初始化用到的特殊方法等,
     五、Heap堆
       1.堆体系结构概述
       一个JVM实例只存在一个堆内存,堆内存的大小是可以调节的,类加载器读取了类文件后,需要把类、方法、常量、变量,放到堆内存中,保存所有引用类型的真实信息,以方便执行器执行
     
     堆分为三大区:
     1:新生代区:
     (1):eden区(伊甸园):当一个对象被第一次new出来的时候会放到新生代区的伊甸园区
     (2):S0区(space):幸存区:当伊甸园区的内存满了的话;被new出来的对象就会放到幸存区中;
     (3):S1区 
     
     
     2:老生区(养老区):如果新生代区都放不下的时候再往养老区放
     3:永久区(持久带) jdk1.8 之后改名为元空间
     
     六、堆内存的调优
       1.常用调优参数列表
       主要熟悉的是总存储空间大小、各个区的比例设置,针对不同的区设定不同的回收器和回收算法,在默认情况下有些选项是不打开的,因此需要手动配置,并且根据自己应用的情况选择适当的参数。
       -Xms 设置初始分配大小,默认为物理内存的1/64
       -Xmx 最大分配内存,默认为物理内存的1/4
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     

     

    展开全文
  • 负责CPU能直接访问( )。对字骨折剧痛应选用节代乙酰水杨酸不良反应不包括解提供药物安全性指标有释执治疗胆绞痛宜选用负责解热镇痛药对字血管扩张药治疗心衰药理学基础是节代阿司匹林不适用于解药物消除...

    负责CPU能直接访问( )。

    对字骨折剧痛应选用

    节代乙酰水杨酸的不良反应不包括

    266359.jpg

    码解提供药物安全性的指标有

    释执治疗胆绞痛宜选用

    负责解热镇痛药

    对字血管扩张药治疗心衰的药理学基础是

    节代阿司匹林不适用于

    码解药物的消除包括以下哪几项

    若有定义:int x=0,*p=,则语句printf('%d\n',*p);的输出结果是

    释执乙酰胆碱酯酶

    有下列程序段:int k=0,a=1,b=2,c=3;k=a<b?b:a;k=k>c?c:k;执行该程序段后,k的值是

    若有定义int x,y; 并已正确给变量赋值,负责则下列选项中与表达式(x-y)?(x++):(y++)中的条件表达式(x-y)等价的是

    设有定义:对字int n1=0,n2,*p=&n2,*q=,以下赋值语句中与n2=n1;语句等价的是

    节代有下列程序段:typedef struct NODE{ int num; struct NODE *next;}OLD;下列叙述中正确的是

    码解下列程序的功能是:给r输入数据后计算半径为r的圆面积s。程序在编译时出错。main( )/* Beginning */{ int r; float s; scanf('%d', s=π*r*r; printf('s=%f\n',s);}出错的原因是

    释执下列关于函数的叙述中正确的是

    当把四个表达式用作if语句的控制表达式时,有一个选项与其他三个选项含义不同,这个选项是

    设有定义:int k=1,m=2; float f=7;则下列选项中错误的表达式是( C )。A) B)-k++ C) D)

    展开全文
  • Java代码执行步骤编译Java文件通过JVM...解释器是软件实现,他将字节码转换成汇编指令,可以实现同一份Java字节码在不同硬件上运行,而将汇编指令转换成机器指令由硬件直接实现,所以他速度会更快。JVM为了提...

    Java代码执行步骤

    20200219130501945104.png

    编译

    Java文件通过JVM的编译器编译成字节码文件,有了字节码,JVM的类加载器就开始加载字节码文件。

    20200219130502103314.png

    解释器

    解释器会将字节码转换成汇编指令,然后在转换成CPU可以识别的机器指令(下图是汇编指令转成机器码的案例)。解释器是软件实现的,他将字节码转换成汇编指令,可以实现同一份Java字节码在不同的硬件上运行,而将汇编指令转换成机器指令由硬件直接实现,所以他的速度会更快。JVM为了提升运行效率,会将某些热点代码,一次全部编译成机器指令再执行。也就是和解释执行对应的即时编译,即时编译的机器码存放在一个叫codecache的缓存的地方,这块内存属于堆外内存,如果这块内存不够了,那么即时编译器将不会再进行编译,可能造成程序运行变慢,这也是排查性能问题变慢的一个点。

    20200219130502240038.png

    内存与CPU的配合

    代码转换成了指令以后,指令必须要有上下文环境,这些环境包括:指令寄存器、数据寄存器、栈空间等内存资源(执行机制如下图)。程序被加载进内存以后,指令就在内存中了,指令的指针寄存器IP,指向内存中的下一条待执行指令的地址,CPU的控制单元根据IP寄存器的指向将主存中的指令装载到指令寄存器,这个指令寄存器也就是一个存储设备,不过他集成在CPU内部,指令从主存到达CPU后,只是一串010101的二进制串,还需要通过译码器进行解码,解码后根据运算类型,在从主存中获取操作数,并调用运算单元进行计算。

    20200219130502378715.png

    我们的数据主要是存储在内存上,然而CPU的计算速度比主存的存取速度快很多倍,所以在两者之间会有多级高级缓存。例如当CPU有个指令是取主存上某一个值,CPU会根据这个值在主存上的位置,去判断是否已经在高速缓存中,如果没有就会去主存中取,取完再放在高速缓存中,这个地方会涉及到一个知识点,就是去主存上读取的时候,并不会仅仅读取一个值,而是把一段长度的值都拿出来并缓存,因为他会假设你既然读了某个位置的值,而这个位置相邻的值也会被读取,就像我们用SQL去查询id=800这行记录的时候,虽然它返回了id=800这行记录,实际上它去读这行记录的时候,把这行记录所在的数据页上的所有数据都放内存里面了,可能下次你去查询id=801行的那条记录的时候,直接就命中缓存,就不用去磁盘去查了,所以我们知道一个缓存行可能缓存了多个字段的值,如果某个进程改了其中一个值,就会导致一整个缓存都会失效,那么这个缓存行上的其他值也会重新从内存读取,所以一些对内存要求比较高的应用,就想规避掉这种情况,比如它们会用对象填充的方式,让某个字段的值可以独占一整个缓存行。

    20200219130502502743.png

    指令执行

    CPU一通上电就会不停的读取指令、运算,周而复始。CPU会给系统运行中的每一个进程都分配一个时间片,在这个时间片内执行对应的进程的指令,过了这个时间片就执行其他的进程,一个进程内的指令执行的顺序,靠每个指令执行完,再去指向下一个指令的位置。当然一个进程内的某些操作,也会主动放弃CPU的执行权限,比如等待IO的操作(如下图),所以为了让一个进程内的指令可以更高效的执行,我们可以让某个线程在等待IO的时候,其他线程能够获取到CPU的执行权限,并继续执行,如果你的任务都是计算型的任务,基本不会有主动释放CPU的情况,那么在单核机器上就没必要开多线程,如果有大量的IO操作那么多线程的效果就会比较好。

    20200219130502640444.png

    内存的分配

    一个JVM启动就会产生一个进程,虽然多个进程会共享一个物理内存,但是每个进程都会拥有自己独立的内存空间,当我们同时启动多个JVM并执行如下代码(下图),将会打印这个对象的hashCode,hashCode默认为内存的地址,最后我们发现它打印的都是Java.lang.Object@4fca772d,也就是说多个JVM进程返回的内存地址都是一样的,这说明每个进程都有单独的地址空间。

    20200219130502732244.png

    实际上每个进程自己都会维护一个虚拟的内存(参考下图),虚拟存储让每个进程以为自己独占整个内存空间,这样的好处是每个进程都拥有一直的虚拟地址空间,简化了内存管理,进程不需要和其他进程竞争内存空间,因为它是独占的,这也保护了各自进程不会被其他进程破坏。每个进程在申请内存的时候,会维护虚拟内存和物理内存的映射关系,避免其他进程占用自己的内存。

    20200219130502861155.png

    而这个虚拟内存空间可能会超过物理内存,当超过物理内存的时候,可能会发生数据溢出,从而存储到磁盘上。页表保存了虚拟地址和物理地址的映射(如下图),页表是一个数组,每一个元素为一个页的映射关系,这个映射关系可能是和主存的,也可能是和磁盘的,页表存储在主存中,也可能存储在缓冲区,我们将存储在高速缓冲区中的页称为TLAB。

    20200219130503018388.png

    Java反射获取对象属性

    参考下图,它首先要获取这个属性相对对象初始位置的偏移量,如果你持有这个对象的引用,你就能获取到这个对象在虚拟内存中的起始地址,然后我们根据属性的偏移量,就可以获取这个属性的虚拟的内存地址,之后再查询页表就可以获取物理的内存的起始地址,接着再根据这个属性的类型取对应长度的数据。写入也是一样的道理,属性相对对象初始位置的偏移量,在加载这个class的时候就确认好了,它是和class绑定的,那么如果一个对象就一个属性,如果不压缩的话那么除了对象头占128位,这个属性的偏移量可能就是128,如果有多个属性JVM会对属性进行重排序和内存对齐,保证对象占用的大小是8的倍数,另一个作用就是保证一个属性的值,都在一个CPU缓存行中,不然一个属性值会一部分在缓存行A中,一部分在缓存行B中。

    20200219130503150229.png

    关键点:

    1.解释执行和即时编译的区别

    2.CPU是如何访问内存里的数据

    3.JVM里面是如何获取某个对象的属性值

    20200219130503271327.png

    展开全文
  • 首先拿python和C说明,python运行速度慢,和C程序相比非常慢,因为Python是解释型语言,你代码在执行时...但是编译后.class文件是字节码,并不是机器能直接执行机器码,它是解释运行在JVM上,所以也有人说它是

    首先拿python和C说明,python运行速度慢,和C程序相比非常慢,因为Python是解释型语言,你的代码在执行时会一行一行地被python解释器翻译成CPU能理解的机器码,这个翻译过程非常耗时,所以很慢。而C/C++程序是编译型语言,运行前直接编译成CPU能执行的机器码,所以非常快。

    但是Java呢?Java运行前需要编译,.java不经过编译就无法执行,所以有人就说Java是编译型的。

    但是编译后的.class文件是字节码,并不是机器能直接执行的机器码,它是解释运行在JVM上的,所以也有人说它是解释型的。

    对于C和C++,它们经过一次编译之后,可以由操作系统直接执行,所以它们是编译型语言。而Java不一样,它首先由编译器编译成.class(字节码)文件,然后在通过JVM从.class文件中读一行解释执行一行,所以它是解释型的语言。也正是由于java对于多种不同的操作系统有不同的JVM,所以实现了真正意义上的跨平台。

    展开全文
  • 今天开始学习JAVA编程

    2011-01-23 21:32:00
    JAVA源程序→通过JAVA编译程序转换为字节码文件→执行(通过安装JAVA字节码解释程序的电脑运行,或直接能解释JAVA字节码的CPU来执行) 备注:并不是所有的操作系统上都运行JAVA程序 转载于:...
  • Java字节码 源代码:是高级语言编写代码(对人是可读) 编译工作流程 编译阶段:从源代码编译成机器码,然后直接运行输出 运行阶段:不需要编译器了。只需要直接运行生成机器码。 特点:高效,但是不...
  • java为什么跨平台

    2020-10-13 20:11:01
    2、一次编译,多次运行,就是说java编译器会将源文件编译为二进制字节码(class),然后拿这字节码去jvm上直接运行(解释执行) 3、主要是在jvm上运行,那么有jvm就可以四处运行(而jvm是安装jre或jdk就有,window...
  • java 代码运行主要流程 本文主要讲解流程如下: java源文件编译为class字节码 ...但是java是一门面向对象高级语言,它不仅语法非常复杂,抽象程度也非常高,并不能直接运行在计算机硬件机器上。...
  • 因为它有虚拟机(JVM),JAVA程序不是直接在电脑上运行的,是在虚拟机... 2,java是先把java文件编译成二进制字节码的class文件,jvm就解释执行class文件。 3,就是因为java是运行在jvm上的,所以它的代码就不经修...
  • java有虚拟机(JVM),JAVA程序不是直接在电脑上运行的,是在虚拟机上... 2.java是先把java文件编译成二进制字节码的class文件,jvm就解释执行class文件。 3.就是因为java是运行在jvm上的,所以它的代码就不经修...
  • 因为它有虚拟机(JVM),JAVA程序不是直接在电脑上运行的,是在虚拟机... 2,java是先把java文件编译成二进制字节码的class文件,jvm就解释执行class文件。 3,就是因为java是运行在jvm上的,所以它的代码就不经修...
  • 初识JAVA

    2020-02-08 21:29:05
    Java入门 Java的特征 跨平台:Java因为拥有JVM,能够帮助Java程序...编译执行:是直译性语言(如,c,c++), 编译结果直接交给CPU运作执行,效率较高,但是不跨平台。 解释执行:是解释性语言(如,Java),编译结...
  • Java为了实现“一次编译,处处运行”特性,把编译过程分成两部分,首先它会先由javac编译成通用中间形式——字节码,然后再由解释器逐条将字节码解释为机器码来执行。所以在性能上,Java通常不如C++这类编译...
  • Java为了实现“一次编译,处处运行”特性,把编译过程分成两部分,首先它会先由javac编译成通用中间形式——字节码,然后再由解释器逐条将字节码解释为机器码来执行。所以在性能上,Java通常不如C++这类编译...
  • 1.java的特征 跨平台 因为有jvm,能够帮助java...编译的结果直接交给我们的CPU运作执行,效率较高,但是不跨平台 编译结果需要通过解释解释之后在交给CPU执行,效率较低 3.安装JDK 安装路径中不出现任何的中...
  • Java为了实现“一次编译,处处运行”特性,把编译过程分成两部分,首先它会先由javac编译成通用中间形式——字节码,然后再由解释器逐条将字节码解释为机器码来执行。所以在性能上,Java通常不如C++这类编译...
  • Java为了实现“一次编译,处处运行”特性,把编译过程分成两部分,首先它会先由javac编译成通用中间形式——字节码,然后再由解释器逐条将字节码解释为机器码来执行。所以在性能上,Java通常不如C++这类编译...
  • java虚拟机(一)

    2018-11-28 10:25:41
    2、中间语言不是本地机器指令,机器cpu无法直接识别,因此中间语言不能直接在物理cpu上直接执行,怎么解决? 用虚拟机来解释中间语言,将中间语言翻译成对应的本地机器指令。 3、将中间语言翻译成本地机器码的方法?...
  • java为什么可以跨平台

    2021-03-23 09:34:02
    程序员编写源代码(.java文件)首先被编译成字节码(.class文件),字节码java虚拟机指令而非机器指令,所以它是与平台无关,它由运行于特定操作系统上的java虚拟机来解释执行。这样,java只要针对不同...
  • Java为了实现“一次编译,处处运行”特性,把编译过程分成两部分,首先它会先由javac编译成通用中间形式——字节码,然后再由解释器逐条将字节码解释为机器码来执行。所以在性能上,Java通常不如C++这类编译...
  • Java为了实现“一次编译,处处运行”特性,把编译过程分成两部分,首先它会先由javac编译成通用中间形式——字节码,然后再由解释器逐条将字节码解释为机器码来执行。所以在性能上,Java通常不如C++这类编译...
  • 1、Java代码不是直接运行在CPU上,而是...2、java是先把java文件编译成二进制字节码的class文件,jvm就解释执行class文件。 3、就是因为java是运行在jvm上的,所以它的代码就不经修改在不同平台的jvm上运行。 ...
  • Java源代码经javac编译后成为二进制字节码的class文件,JVM解释执行c lass文件 Java代码不是直接运行在CPU上,而是运行在Java虚拟机(JVM) 正是因为运行在虚拟机,所以它的代码可以不用修改就在不同的平台的JVM...
  • java有虚拟机(JVM),JAVA程序不是直接在电脑上运行的,是在虚拟机上... 2,java是先把java文件编译成二进制字节码的class文件,jvm就解释执行class文件。 3,就是因为java是运行在jvm上的,所以它的代码就不经...
  • Java面试系列1—JVM

    2020-12-16 00:39:30
    ①程序计数器可以看作是当前线程所有执行的字节码行号指示器, 这样字节码解释器就可以通过改变这个计数器值来获取下一条需要执行的字节码指令,这个有点像CPU里面程序计数器工作原理。 线程私有,由于JVM多...
  • Java为了实现“一次编译,处处运行”特性,把编译过程分成两部分,首先它会先由javac编译成通用中间形式——字节码,然后再由解释器逐条将字节码解释为机器码来执行。所以在性能上,Java通常不如C++这类编译...
  • java运行机制

    千次阅读 2014-05-04 16:55:20
    .class二进制字节码文件--JVM中解释执行-->机器指令 机器指令:计算机所识别指令,跟操作系统和CPU等硬件相关 编译型:源文件---编译器---可执行文件(一些机器指令和数据) 优点:一次性编译成可...
  • JAVA上百实例源码以及开源项目

    千次下载 热门讨论 2016-01-03 17:37:40
     Java生成密钥、保存密钥实例源码,通过本源码可以了解到Java如何产生单钥加密密钥(myKey)、产生双钥密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥...
  • 算法相关,密钥 Java生成密钥、保存密钥实例源码,通过本源码可以了解到Java如何产生单钥加密密钥(myKey)、产生双钥密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象...

空空如也

空空如也

1 2 3
收藏数 46
精华内容 18
关键字:

能直接解释java字节码的cpu

java 订阅