‘壹’ JVM的组成和运行原理是什么
JVM是java Virtual Machine(Java虚拟机)的缩写。
1、JVM的组成:
JVM 由类加载器子系统、运行时数据区、执行引擎以及本地方法接口组成。
2、JVM的运行原理:
JVM是java的核心和基础,在java编译器和os平台之间的虚拟处理器。它是一种基于下层的操作系统和硬件平台并利用软件方法来实现的抽象的计算机,可以在上面执行java的字节码程序。java编译器只需面向JVM,生成JVM能理解的代码或字节码文件。Java源文件经编译器,编译成字节码程序,通过JVM将每一条指令翻译成不同平台机器码,通过特定平台运行。
‘贰’ java编译器和JVM有什么区别
java编译器把java源码编译成字节码 (.class文件).
jvm是在运行期将class文件编译成机器码文件.供程序运行.
‘叁’ jvm原理是什么呢
jvm原理是java的核心和基础,在java编译器和os平台之间的虚拟处理器。它是一种利用软件方法实现的抽象的计算机基于下层的操作系统和硬件平台,可以在上面执行java的字节码程序,java编译器只要面向JVM,生成JVM能理解的代码或字节码文件。
jvm执行程序的过程
加载.class文件,管理并分配内存,执行垃圾收,四步完成JVM环境,创建JVM装载环境和配置,装载JVM.dll,初始化JVM.dll并挂界到JNIENV(JNI调用接口)实例,调用JNIEnv实例装载并处理class类。
JVM实例和JVM执行JVM实例对应了一个独立运行的java程序,进程级别, 一个运行时的Java虚拟机(JVM)负责运行一个Java程序,当启动一个Java程序时,一个虚拟机实例诞生,当程序关闭退出,这个虚拟机实例也就随之消亡。
‘肆’ Java JVM怎么学习啊从哪方面入手
Java JVM如何学习?首先要了解他的类型!
java虚拟机学习
数据类型(基本类型、引用类型)====>数值本身、引用值 2. 堆、栈=====>栈是运行时的单位(如何处理数据),堆是存储的单位(数据如何存储)
------栈因为是运行单位,因此里面存储的信息都是跟当前线程(或程序相关信息的。包括局部变量、程序运行状态、方法返回值等等;而堆只负责存储对象信息。在Java中,Main函数就是栈的起始点,也是程序的起始点。堆中存的是对象,栈中存的是基本数据类型和堆中对象的引用
Java中的参数传递时传值呢?还是传引用?
a) 程序运行永远都是在栈中进行的,因而参数传递时,只存在传递基本类型和对象引
用的问题。不会直接传对象本身。
b) Java在方法调用传递参数时,因为没有指针,所以它都是进行传值调用
c) 堆和栈中,栈是程序运行最根本的东西。程序运行可以没有堆,但是不能没有栈。
而堆是为栈进行数据存储服务,说白了堆就是一块共享的内存。不过,正是因为堆和栈的分离的思想,才使得Java的垃圾回收成为可能
Java对象的大小
a) 一个空Object对象的大小是8byte(没有任何属性的对象) b) Object ob = new Object();所占的空间为:4byte+8byte。4byte是上面部分所说的Java
栈中保存引用的所需要的空间。而那8byte则是Java堆中对象的信息.不论什么样的Java对象,其大小都必须是大于8byte
c) Java在对对象内存分配时都是以8的整数倍来分,基本类型包装类的大小至少是
16byte
引用类型
a) 对象引用类型分为强引用、软引用、弱引用和虚引用。
b) 强引用:就是我们一般声明对象是时虚拟机生成的引用,强引用环境下,垃圾回收
时需要严格判断当前对象是否被强引用,如果被强引用,则不会被垃圾回收 c) 软引用:软引用一般被作为缓存来使用。与强引用的区别是,软引用在垃圾回收时,
虚拟机会根据当前系统的剩余内存来决定是否对软引用进行回收。如果剩余内存比较紧张,则虚拟机会回收软引用所引用的空间;如果剩余内存相对富裕,则不会进行回收。换句话说,虚拟机在发生OutOfMemory时,肯定是没有软引用存在的。 d) 弱引用:弱引用与软引用类似,都是作为缓存来使用。但与软引用不同,弱引用在
进行垃圾回收时,是一定会被回收掉的,因此其生命周期只存在于一个垃圾回收周期内。
JVM调优总结(三)-基本垃圾回收算法 7. 垃圾回收面临的问题
a) 如何区分垃圾。垃圾回收的起点是一些根对象(java栈, 静态变量, 寄存器...)。而
最简单的Java栈就是Java程序执行的main函数 b) 如何处理碎片。“复制”方式和“标记-整理”方式,都可以解决碎片的问题。 c) 如何解决同时存在的对象创建和对象回收问题;在现有的垃圾回收方式中,要进行
垃圾回收前,一般都需要暂停整个应用(即:暂停内存的分配),然后进行垃圾回收,回收完成后再继续应用
8. 分代垃圾回收详述
a) 为什么要分代:不同的对象的生命周期是不一样的。因此,不同生命周期的对象可
以采取不同的收集方式,以便提高回收效率。
b) 如何分代虚拟机中的共划分为三个代:年轻代(Young Generation)、年老点(OldGeneration)和持久代(Permanent Generation)。其中持久代主要存放的是Java类的类信息,与垃圾收集要收集的Java对象关系不大。年轻代和年老代的划分是对垃圾收集影响比较大的
什么情况下触发垃圾回收GC有两种类型:Scavenge GC(当新对象生成,并且在Eden
申请空间失败时,就会触发Scavenge GC,对Eden区域进行GC,清除非存活对象,并且把尚且存活的对象移动到Survivor区)和Full GC(对整个堆进行回收)
典型配置举例
a) 堆大小设置
b) 回收器选择。串行收集器、并行收集器、并发收集器,但是串行收集器只适用于小
数据量的情况,所以这里的选择主要针对并行收集器和并发收集器。
垃圾回收的瓶颈
a) 传统分代垃圾回收方式,已经在一定程度上把垃圾回收给应用带来的负担降到了最
小,把应用的吞吐量推到了一个极限。但是他无法解决的一个问题,就是Full GC所带来的应用暂停
学习java的伙伴加我的 群去下载视频资料 540-998-279!
‘伍’ 关于JVM和编译器
编译为字节码的JAVA程序可以直接在JVM上运行,无需再次编译.
C程序必须在不同的平台重新编译,并且可能需要依据不同的系统修改程序中用到的数据类型.
‘陆’ 什么是JVMJava跨平台的原理是什么
首先我们要理解什么是跨平台,所谓的跨平台就是JAVA写的一份代码可以在任意的操作系统平台上运行。
为什么跨平台会成为一个问题呢?因为每一个操作系统平台支持不同的指令集我们所写的代码经过编译之后只能适用于一个平台,换一个平台就不支持了。而JAVA完美的解决了这个问题。
Java的一大特色就是“write once, run anywhere”即“一次编译,到处运行”。就是说你不用专门为每个平台写一份代码,你写的Java程序在任何平台都能跑起来。
它的实现原理是在系统层面上又增加了一层虚拟机(Java Virtual Machine,简称JVM),且为每个平台都定制了对应的虚拟机。然后Java程序是在虚拟机上跑的,因此平台无关。
Java的运行流程是:程序员写了源代码(Source Code,.java后缀,跨平台),然后经过编译器编译成字节码(Byte Code,.class后缀,二进制文件),字节码是所有虚拟机都能理解的中间文件。然后交给虚拟机(每个平台都有对应的虚拟机)去运行。
所以对“write once, run anywhere”更准确的理解是,“一次编译,到处装虚拟机,所以到处运行”。
整个流程如下图所示。
‘柒’ 如何实现一个能在jvm上运行的语言的编译器
读读下面这本书就可以有个大体概念:
Language Implementation Patterns
还有一本,我没读过不过主题挺合适题主的:
Introction to Compiler Construction in a Java World
如果按问题描述来,“Scala、Clojure、JRuby这类的编程语言是如何实现的?”,要回答这个问题就得下到更细节的层面,不是三言两语能说清楚的。
偷个懒,还是建议题主先读读前面两本书再说。
Scala和Clojure在JVM上的实现都是把程序静态编译到Java字节码然后再交由JVM执行。
JRuby自身有混合执行系统,有一个用Java写的解释器和一个编译器。
解释器可以直接解释执行Ruby程序。以前JRuby的解释器是AST解释器,新版用的是一个IR解释器。
编译器把Ruby程序编译为Java字节码再交给JVM执行,不过这个编译通常是运行时做的而不像Scala和Clojure是静态做的。
‘捌’ jvm怎么编译运行类的
设置好环境变量后,运行cmd.exe,cd到你*.java目录
使用命令:javac *.java来编译java文件
java * 来运行文件。
‘玖’ JAVA游戏中的.class文件是干什么的,什么意思是怎么编译的我自己该怎么制作一个可执行的J
.class是类文件,里面就是代码,源文件是 xx.java,编译后会成为xx.class文件,由java的jvm编译,如果你要做一个java程序,先要在你的电脑安装jdk,然后就是开放工具,你可以下个 myEclipse ,买本看或者在网上找找一些教学视频吧。