jvm有什么用
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 看来也和这贴干上了。
一会儿这贴成论文贴了
***********************************
以上回答可能有错误,要参考其他人的答案。
参考资料: 百度一下
2015-06-26
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 看来也和这贴干上了。
一会儿这贴成论文贴了。
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 看来也和这贴干上了。
一会儿这贴成论文贴了
***********************************
以上回答可能有错误,要参考其他人的答案。
概念
虚拟机:指以软件的方式模拟具有完整硬件系统功能、运行在一个完全隔离环境中的完整计算机系统 ,是物理机的软件实现。常用的虚拟机有VMWare,Visual Box,Java Virtual Machine(Java虚拟机,简称JVM)。
Java虚拟机阵营:Sun HotSpot VM、BEA JRockit VM、IBM J9 VM、Azul VM、Apache Harmony、Google Dalvik VM、Microsoft JVM…
启动流程
基本架构
Java运行时编译源码(.java)成字节码,由jre运行。jre由java虚拟机(jvm)实现。Jvm分析字节码,后解释并执行。
JVM由三个主要的子系统构成:
1.类加载器子系统
2.运行时数据区(内存)
3.执行引擎
引用计数法:给每个对象添加一个计数器,当有地方引用该对象时计数器加1,当引用失效时计数器减1。用对象计数器是否为0来判断对象是否可被回收。缺点:无法解决循环引用的问题
根搜索算法:也称可达性分析法,通过“GC
ROOTs”的对象作为搜索起始点,通过引用向下搜索,所走过的路径称为引用链。通过对象是否有到达引用链的路径来判断对象是否可被回收(可作为GC
ROOTs的对象:虚拟机栈中引用的对象,方法区中类静态属性引用的对象,方法区中常量引用的对象,本地方法栈中JNI引用的对象)Minor GC:新生代(Young Gen)空间不足时触发收集,由于Java 中的大部分对象通常不需长久存活,新生代是GC收集频繁区域,所以采用复制算法。
Full GC:老年代(Old Gen )空间不足或元空间达到高水位线执行收集动作,由于存放大对象及长久存活下的对象,占用内存空间大,回收效率低,所以采用标记-清除算法。
1.标记-清除算法:分为两阶段“标记”和“清除”。首先标记出哪些对象可被回收,在标记完成之后统一回收所有被标记的对象所占用的内存空间。不足之处:1.无法处理循环引用的问题2.效率不高3.产生大量内存碎片(ps:空间碎片太多可能会导致以后在分配大对象的时候而无法申请到足够的连续内存空间,导致提前触发新一轮gc)
2.标记-整理算法:分为两阶段“标记”和“整理”。首先标记出哪些对象可被回收,在标记完成后,将对象向一端移动,然后直接清理掉边界以外的内存。
3.复制算法:把内存空间划为两个相等的区域,每次只使用其中一个区域。gc时遍历当前使用区域,把正在使用中的对象复制到另外一个区域中。算法每次只处理正在使用中的对象,因此复制成本比较小,同时复制过去以后还能进行相应的内存整理,不会出现“碎片”问题。不足之处:1.内存利用率问题2.在对象存活率较高时,其效率会变低。
1.增量收集:实时垃圾回收算法,即:在应用进行的同时进行垃圾回收,理论上可以解决传统分代方式带来的问题。增量收集把对堆空间划分成一系列内存块,使用时先使用其中一部分,垃圾收集时把之前用掉的部分中的存活对象再放到后面没有用的空间中,这样可以实现一直边使用边收集的效果,避免了传统分代方式整个使用完了再暂停的回收的情况。
2.分代收集:(商用默认)基于对象生命周期划分为新生代、老年代、元空间,对不同生命周期的对象使用不同的算法进行回收。
1.串行收集:使用单线程处理垃圾回收工作,实现容易,效率较高。不足之处:1.无法发挥多处理器的优势 2.需要暂停用户线程
2.并行收集:使用多线程处理垃圾回收工作,速度快,效率高。理论上CPU数目越多,越能体现出并行收集器的优势。不足之处:需要暂停用户线程
3.并发收集:垃圾线程与用户线程同时工作。系统在垃圾回收时不需要暂停用户线程
StackOverflowError:(栈溢出)
OutOfMemoryError: Java heap space(堆空间不足)
OutOfMemoryError: GC overhead limit exceeded (GC花费的时间超过 98%, 并且GC回收的内存少于 2%)
垃圾收集(GC:Garbage Collection)
1、如何识别垃圾,判定对象是否可被回收?
2、Java 中的堆是 GC 收集垃圾的主要区域,GC 分为两种:Minor GC、Full GC ( 或称为 Major GC )。
GC算法
按照回收策略划分为:标记-清除算法,标记-整理算法,复制算法。
按分区对待可分为:增量收集算法,分代收集算法
按系统线程可分为:串行收集算法,并行收集算法,并发收集算法
GC收集器常用组合
JVM性能调优思路
常见异常
常在这里回答问题,热爱技术,喜欢帮别人解答行业技术问题和行业知识。
如果大家对于学习前端有任何不懂的可以随时来问我,我给你提供一个非常不错的java交流学习qun:前面是六四一,中间是一二一,后面是九四八。有问题就在里面问我,这样你可以少走很多弯路,做起来有效率,记得多跟有经验的人交流,别闭门造车。如果没有比较好的教程,也可以管我要。