怎么写jvm

1.听说JVM是用C++写的

LZ您好,这样回答你吧,C/C++语言对内存(计算机资源)的掌握度很强,也就是为什么从事C/C++开发会老是遇到死机之类的情况,但这也是优点,好的代码效率很高,使用不当则会出现各种问题。

JAVA是屏蔽掉这些直接认为操作内存的通道,让JVM自己去管理这些内存,好比说垃圾回收,但是JAVA程序的运行是需要到访问计算机资源的,为了提高效率可以适当的使用本地方法(C/C++编写的方法),甚至有些是必须通过使用这些本地方法才能完成需要。小弟也是才看差不多一个星期的JVM,就瞎说点东西,希望你谅解,勿喷~~~。

2.Java JVM怎么学习啊

一、JVM的生命周期 1. JVM实例对应了一个独立运行的java程序它是进程级别 a) 启动。

启动一个Java程序时,一个JVM实例就产生了,任何一个拥有public static void main(String[] args)函数的class都可以作为JVM实例运行的起点 b) 运行。main()作为该程序初始线程的起点,任何其他线程均由该线程启动。

JVM内部有两种线程:守护线程和非守护线程,main()属于非守护线程,守护线程通常由JVM自己使用,java程序也可以标明自己创建的线程是守护线程 c) 消亡。当程序中的所有非守护线程都终止时,JVM才退出;若安全管理器允许,程序也可以使用Runtime类或者System.exit()来退出 2. JVM执行引擎实例则对应了属于用户运行程序的线程它是线程级别的 二、JVM的体系结构 1. 类装载器(ClassLoader)(用来装载.class文件) 2. 执行引擎(执行字节码,或者执行本地方法) 3. 运行时数据区(方法区、堆、java栈、PC寄存器、本地方法栈) 三、JVM类加载器 JVM整个类加载过程的步骤: 1. 装载 装载过程负责找到二进制字节码并加载至JVM中,JVM通过类名、类所在的包名通过ClassLoader来完成类的加载,同样,也采用以上三个元素来标识一个被加载了的类:类名+ 包名+ClassLoader实例ID。

2. 链接 链接过程负责对二进制字节码的格式进行校验、初始化装载类中的静态变量以及解析类中调用的接口、类。 完成校验后,JVM初始化类中的静态变量,并将其值赋为默认值。

最后对类中的所有属性、方法进行验证,以确保其需要调用的属性、方法存在,以及具备应的权限(例如public、private域权限等),会造成NoSuchMethodError、NoSuchFieldError等错误信息。 3. 初始化 初始化过程即为执行类中的静态初始化代码、构造器代码以及静态属性的初始化,在四种情况下初始化过程会被触发执行: 调用了new; 反射调用了类中的方法; 子类调用了初始化; JVM启动过程中指定的初始化类。

JVM类加载顺序: JVM两种类装载器包括:启动类装载器和用户自定义类装载器。 启动类装载器是JVM实现的一部分; 用户自定义类装载器则是Java程序的一部分,必须是ClassLoader类的子类。

JVM装载顺序: Jvm启动时,由Bootstrap向User-Defined方向加载类; 应用进行ClassLoader时,由User-Defined向Bootstrap方向查找并加载类; 1. Bootstrap ClassLoader 这是JVM的根ClassLoader,它是用C++实现的,JVM启动时初始化此ClassLoader,并由此ClassLoader完成$JAVA_HOME中jre/lib/rt.jar(Sun JDK的实现)中所有class文件的加载,这个jar中包含了java规范定义的所有接口以及实现。 2. Extension ClassLoader JVM用此classloader来加载扩展功能的一些jar包。

3. System ClassLoader JVM用此classloader来加载启动参数中指定的Classpath中的jar包以及目录,在Sun JDK中ClassLoader对应的类名为AppClassLoader。 4. User-Defined ClassLoader User-DefinedClassLoader是Java开发人员继承ClassLoader抽象类自行实现的ClassLoader,基于自定义的ClassLoader可用于加载非Classpath中的jar以及目录。

ClassLoader抽象类的几个关键方法: (1) loadClass 此方法负责加载指定名字的类,ClassLoader的实现方法为先从已经加载的类中寻找,如没有则继续从parent ClassLoader中寻找,如仍然没找到,则从System ClassLoader中寻找,最后再调用findClass方法来寻找,如要改变类的加载顺序,则可覆盖此方法 (2) findLoadedClass 此方法负责从当前ClassLoader实例对象的缓存中寻找已加载的类,调用的为native的方法。 (3) findClass 此方法直接抛出ClassNotFoundException,因此需要通过覆盖loadClass或此方法来以自定义的方式加载相应的类。

(4) findSystemClass 此方法负责从System ClassLoader中寻找类,如未找到,则继续从Bootstrap ClassLoader中寻找,如仍然为找到,则返回null。 (5) defineClass 此方法负责将二进制的字节码转换为Class对象 (6) resolveClass 此方法负责完成Class对象的链接,如已链接过,则会直接返回。

四、JVM执行引擎 在执行方法时JVM提供了四种指令来执行: (1)invokestatic:调用类的static方法 (2)invokevirtual:调用对象实例的方法 (3)invokeinterface:将属性定义为接口来进行调用 (4)invokespecial:JVM对于初始化对象(Java构造器的方法为:)以及调用对象实例中的私有方法时。 主要的执行技术有: 解释,即时编译,自适应优化、芯片级直接执行 (1)解释属于第一代JVM, (2)即时编译JIT属于第二代JVM, (3)自适应优化(目前Sun的HotspotJVM采用这种技术)则吸取第一代JVM和第二代 JVM的经验,采用两者结合的方式 开始对所有的代码都采取解释执行的方式,并监视代码执行情况,然后对那些经常调用的方法启动一个后台线程,将其编译为本地代码,并进行优化。

若方法不再频繁使用,则取消编译过的代码,仍对其进行解释执行。 五、JVM运行时数据区 第一块:PC寄存器 PC寄存器是用于存储每个线程下一步将执行的JVM指令,如该方法为native。

3.jvm是如何实现的

编程语言和自然语言类似,都是为了交流,自然语言用于跟人交流,程序语言则用于指示机器。

jvm其实也就是一个程序,这个程序能接受你的Java代码,然后根据你的意愿执行一系列操作。

举个例子,你可以写一个这样的程序,这个程序接受用户输入一句话,如果用户输入“beep”则调用机器的鸣叫,如果用户输入“exit”,则关掉本程序。在这个例子中,其实用户写的“beep”和“exit”就充当了程序语言的角色,只不过这门语言过于简单因此不可能普及。而java则具有完善的体系能够支持你表达任何意愿,然后jvm理解你的java语言并执行相应操作,这就是程序语言的原理。

当然java还有优化的方案,它的编译器将你的java语言翻译成字节码,因为jvm执行字节码的速度比直接理解java代码要快很多,后来的版本还引入了JIT技术,实时将字节码再编译成机器码,这样就能让机器直接执行指令而不需要jvm去解释。

至于垃圾收集器,就是jvm维护着每一个对象的引用(可以理解成C++里面的指针),根据一定的算法判断其是否可达,如果这个引用不可达(也就是程序的后续部分已经无法获取这个引用,比如说已超出block范围了)那么就清除这个内存对象。这样的好处是能避免由于程序员的疏忽引起的内存泄露,缺点是内存的清理不够即时,因而无用的对象常常会占据内存很长时间。

你也可以在C++里实现垃圾回收器,思路是写一个用于管理内存的类,然后程序里不再用new来新建对象,而是用这个类来产生对象,类内部拥有这个对象的指针,并在适当的时候delete它,这样就实现垃圾自动回收了,当然要写这样一个类是很困难的事。

4.一段小程序有几种写法,如何评价JVM对其的执行效率

在Java层面讨论这种粒度的细节可能不太合适。

Oracle JDK8 / OpenJDK8里的HotSpot VM里,当被HotSpot Server

Compiler(C2)编译过后,Math.addExact()的overflow检查是用硬件自带的指令完成的,开销极低,比各种显式用运算的方式检查都快多了。

例如在x86上,Math.addExact(int, int)int会被编译为类似:

X86代码

add eax, edx # 普通的32位整数加法

jo throw_ArithmeticException # overflow的话跳到抛异常的逻辑

因为x86上加法指令都会设置EFLAGS/RFLAGS里的OF(overflow flag),要检测有没有overflow只要在后面用jo(jump if overflow)就好了。其它CPU也是类似,很少CPU是没有这种功能的…

这么一来,在没有overflow的时候无论写什么形式的Java代码都不如直接调用Math.addExact()快;在有overflow的时候则不同,因为Java

8

API的设计还是太煞笔,只提供了抛异常的版本而没提供别的方式返回是否overflow的版本的API,所以如果经常overflow的话用Math.addExact()未必快,要看情况。

5.jvm有什么用

java是面向对象编程,一切皆对象。这个观念要以后慢慢才能了解,无论怎么样讲都是初学者理解不了的。所以还需要多多练习。

C语言是面向过程编程的。所以没有“类”的概念,而java的类却更符合人类的思维方式,C语言更符合机器的思维方式。

还有就是,千万不要把C语言的一些概念和java混淆,这是两种不同类型的语言,java是纯的面向对像的编程语言,而C是面向过程的。以后的学习中你会发现java比C更有优势。再重申一下,最好不要把C的概念和java做对比。你把java当作一门新的语言来学。 唯一可以借鉴C的就是语法和编程的一些基本概念如数据类型,设计模式之类的。

jvm 是java虚拟机,将java的class字节码文件翻译成二进制可执行程序。

jdk 是java的开发包 java sdk, java的开发工具,包含SUN公司提供的java API,将java源码编译为class字节码文件,通常jdk中就包含了jre。

jre 是java运行时,用于执行java程序。

jse 是java标准开发,jse 就是java开发的一种,标准开发,例如开发桌面程序。

其余的还有 javaEE, javaMe 前者是java的企业应用,后者是java的嵌入式开发,例如java手机程序。

如果netbeans能运行,说明你安装的netbeans已经包含了JDK,而jdk里已经包含了jre和jvm,故以后就可以省心了,至于环境变量的事情,你可以去搜索一下,很简单的配置,有个好消息告诉你,如果你是按照安装向导操作的,向导会自动将环境变量写进去。

java基础类库就是API,而你说的“库”我不太明白是什么意思。

jdk是开发工具包,里面包含 javaSE, JRE, JVM

jdk 把.java文件编译成为.class字节码文件

然后JRE调用JVM将字节码文件翻译成可供机器执行的程序。就这样了啊。

最后说一句: 不推荐使用Netbeans, 现在公司里都用Eclipse,这才是趋势。

************************************8

继续补充

angelicdemon 所说的没错,IDE环境会在配置文件里自己写上jdk和jre的路径以便找到他们。

但是经过安装向导安装jdk后确实会自动将java所需要的环境变量写进系统环境变量中。再有,如果使用IDE的话 环境变量没啥用处,只有用命令行模式编译java源码才会有用处。

另外: Eclipse绝对是现在公司的首选,因为公司里的项目用ECLIPSE构建的,源码上传到版本控制系统后,同步后,你用Netbeans打不开,还得重新构建,麻烦吗? 再说了NB和EC还是有相当大区别的。

还有就是,这句话最重要,如果你真的是java初学者,绝对不要用IDE,用记事本+命令行 这样才能真正掌握java的机理。 哈哈 累死我了,就写到这吧

angelicdemon 看来也和这贴干上了。

一会儿这贴成论文贴了

***********************************

以上回答可能有错误,要参考其他人的答案。

怎么写jvm

转载请注明出处育才学习网 » 怎么写jvm

知识

拼音v的声调怎么写

阅读(11488)

本文主要为您介绍拼音v的声调怎么写,内容包括拼音v的四声怎么写,拼音声调怎么写,拼音i的声调怎么写。一:拼音声调包含四个:一声平()二声扬(/)三声拐弯(∨)四声降(\)二、标省调规则:按a、o、e、i、u、ü出现的先后顺序,声调标在先

知识

拼音j的大写字母怎么写

阅读(1442)

本文主要为您介绍拼音j的大写字母怎么写,内容包括“j”字母大小写,怎么写,26个音序(拼音的大写字母)怎么读,各国的大写J字母怎么写的。“j”字母大小写具体如何书写,如下图所示:

知识

池的笔画顺序怎么写的

阅读(187)

本文主要为您介绍池的笔画顺序怎么写的,内容包括就的笔画顺序怎么写的,吃的笔画顺序怎么写的,池的笔画顺序怎么写。就的笔顺:点、横、竖、横折、横、竖钩、撇、点、横、撇、竖弯钩、点、 二、拼音:jiù 三、释义:凑近;靠近:迁~。避难~易。2、到;

知识

ktv工作计划怎么写啊

阅读(174)

本文主要为您介绍ktv工作计划怎么写啊,内容包括ktv工作计划怎么写,ktv工作计划怎么写,ktv工作计划。写好工作计划四大要素工作内容:做什么(WHAT)--------工作目标、任务。计划应规定出在一定时间内所完成的目标、任务和应达到要求。

知识

追求梦想英文怎么写

阅读(920)

本文主要为您介绍追求梦想英文怎么写,内容包括追求梦想,坚持梦想用英语怎么说,追求梦想这四个,字用英语怎么写,“追求梦想”用英文怎么翻译,要标准答案。追求梦想,坚持梦想Pursue dreams, stick to dreams。pursue 英[pəˈsju:]美[pərˈsu

知识

作文组词怎么写

阅读(586)

本文主要为您介绍作文组词怎么写,内容包括“文”字组词大全,作业的作字多音字组词,作文的作多音字组词。作业的作字不是多音字作的解释[zuò] 1. 起,兴起,现在起:振~。枪声大~。2. 从事,做工:工~。~息。~业。3. 举行,进行:~

知识

AA式的词语怎么写

阅读(230)

本文主要为您介绍AA式的词语怎么写,内容包括请写出AA式的词语,AA式的词语,(如哗哗这样的),能写几,AA式的词语,(如哗哗这样的),能写几。aa式的词语 :太太、常常、轻轻、处处、爷爷、谢谢、爸爸、星星、刚刚、数数、妈妈、姐姐、奶奶、叔叔、慢慢

知识

八千元怎么写大写

阅读(3780)

本文主要为您介绍八千元怎么写大写,内容包括数字8000的大写怎么写,大写八千元怎么写,八千元收条怎么写,数字1000的大写怎么写,大写一千元怎么写。2000元的支票大写:贰仟元整。人民币(大写):数字大写写法:零、壹、贰、叁、肆、伍、陆、柒、捌、玖

知识

匆忙的英语怎么写

阅读(229)

本文主要为您介绍匆忙的英语怎么写,内容包括“匆忙”的英语单词怎么写,匆忙用英语怎么说,匆忙用英语怎么写。匆忙的英语:hurry 读音:英 [hʌri] 美 [hɜːri] v. 匆忙;催促;赶紧 n. 匆忙;仓促;急忙 词汇搭配: hurr

知识

大写j的格式怎么写

阅读(771)

本文主要为您介绍大写j的格式怎么写,内容包括J的小写怎么写,大写字母J在四线三格怎么写,大写j怎么写。大写字母J在四线三格的写法如下图:

知识

feet音标怎么写

阅读(210)

本文主要为您介绍feet音标怎么写,内容包括48个音标咋写,fond的音标怎么写,看音标写单词。26个字母发音规律 a /ei/ name cake table /æ/ apple cat map am /α: / want dan

知识

a的印刷体怎么写

阅读(359)

本文主要为您介绍a的印刷体怎么写,内容包括/a:/这个音标手写体是这样按印刷体写吗,还是按平时写单词的那样,/a:/这个音标手写体是这样按印刷体写吗,还是按平时写单词的那样,为什么英文中的小写字母“a”,手写体和印刷体的形状完全不同。平常

知识

tea的音标怎么写

阅读(255)

本文主要为您介绍tea的音标怎么写,内容包括herbaltea的音标,herbaltea的音标,茶的英语怎么写。herbalKK: []DJ: []a.1. 草本的n.1. 草本书;植物志teaKK: []DJ: []n.1. 茶;茶叶[U]I p

知识

ios开发的经验怎么写

阅读(188)

本文主要为您介绍ios开发的经验怎么写,内容包括ios简历项目经验怎么写,面试iOS工程师简历该如何写好呢主要是没有实际开发经验,现在很,分享哪些年我学习IOS开发的经历。2、你在项目组中的位置、是否能独立解决问题;3、你的业务知识与团队合

[/e:loop]