jvm原理是什么呢?JRE和JVM有什么关系

jvm原理是什么呢?JRE和JVM有什么关系

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程序时,一个虚拟机实例诞生,当程序关闭退出,这个虚拟机实例也就随之消亡。


JRE和JVM有什么关系


简单地说,jre包含jvm,jvm是运行java的核心虚拟机,而运行java程序不仅需要核心虚拟机,还需要其他的类加载器,字节码校验器,以及大量的基础类库。jre除了包含jvm外,还包含运行java程序的其他环境支持。

jre 即java运行时环境,全称是Java Runtime Environment,是java程序运行的必须条件。jvm (Java Virtual Machine) 即java虚拟机,是可以运行java字节码文件的虚拟计算机。

扩展资料

JRE是运行基于Java语言编写的程序所不可缺少的运行环境。也是通过它,Java的开发者才得以将自己开发的程序发布到用户手中,让用户使用。JRE中包含了Java virtual machine(JVM),runtime class libraries和Java application launcher,这些是运行Java程序的必要组件。

与大家熟知的JDK不同,JRE是Java运行环境,并不是一个开发环境,所以没有包含任何开发工具(如编译器和调试器),只是针对于使用Java程序的用户。

金字塔结构 JDK=JRE+JVM+其它 运行Java程序一般都要求用户的电脑安装JRE环境(Java Runtime Environment);没有jre,java程序无法运行;而没有java程序,jre就没有用武之地。


jdk,jre,jvm三者间有何关系


JVM:Java虚拟机,它是整个java实现跨平台的最核心的部分,所有的java程序会首先被编译为.class的类文件,这种类文件可以在虚拟机上执行。

JRE:Java运行环境,光有JVM还不能让class文件执行,因为在解释class的时候JVM需要调用解释所需要的类库lib。

JDK:Java开发工具包

JDK,JRE,JVM三者关系概括如下:

JDK是JAVA程序开发时用的开发工具包,其内部也有Java运行环境JRE。JRE是Java程序运行时需要的运行环境,就是说如果你光是运行Java程序而不是去搞开发的话,只安装JRE就能运行已经存在的Java程序了。JDk、JRE内部都包含JAVA虚拟机JVM,JAVA虚拟机内部包含许多应用程序的类的解释器和类加载器等等。


jvm是什么


jvm是java virtual machine的缩写,翻译过来就是java虚拟机,是用来解释执行java程序(java字节码)的系统软件。
而java是一种编程语言。

JVM是什么


JVM是Java虚拟机,所有的Java程序都在Java虚拟机中运。
JDK是Java开发工具包,用来开发Java程序。
jdk中有一个编译器,可以把你的java源代码编译成可以在虚拟机(jvm)
上运行的字节码(中间代码).

jvm有什么作用


jvm是java虚拟机,也是跨平台运行的基础,java编译的.class字节码文件交由jvm虚拟机二次编译后再交由操作系统去执行计算。不同的操作系统、不同的位数使用不同版本的jvm

jvm是指什么


楼上这个没看题目吧。人家问的JVM,不是JRE。
JVM,Java Virtual Machine,也就是Java虚拟机,可以认为是Java代码运行的容器,包括了内存管理等内容。
估计你是新手,可以这么认为,必须有JVM,才能为Java代码开辟内存空间,才能让你的Java代码运行起来。

jvm指的是什么


虚拟机概念:指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的计算机系统
JVM使用软件模拟Java字节码的指令集
JVM与VMWare 的区别:VMWare模拟的是真实存在的计算机系统,JVM模拟的是虚拟的,真实不存在的
Java语言规范定义了什么是Java语言
JVM主要定义二进制class文件和JVM指令集,Java语言和JVM相对独立
JVM整数的表达:
原码:第一位为符号位(0为正数,1为负数),其他为为数字的二进制表示
反码:符号位不动,原码取反
负数补码:符号位不动,反码加1
正数补码:和原码相同
学习java,就来北京尚学堂,优秀的师资和科学的授课方式,会带给你最好的学习体验。

jvm的理解


1
JVM内存区域

我们在编写程序时,经常会遇到OOM(out of Memory)以及内存泄漏等问题。为了避免出现这些问题,我们首先必须对JVM的内存划分有个具体的认识。JVM将内存主要划分为:方法区、虚拟机栈、本地方法栈、堆、程序计数器。JVM运行时数据区如下:
1.1
程序计数器
程序计数器是线程私有的区域,很好理解嘛~,每个线程当然得有个计数器记录当前执行到那个指令。占用的内存空间小,可以把它看成是当前线程所执行的字节码的行号指示器。如果线程在执行Java方法,这个计数器记录的是正在执行的虚拟机字节码指令地址;如果执行的是Native方法,这个计数器的值为空(Undefined)。
此内存区域是唯一一个在Java虚拟机规范中没有规定任何OutOfMemoryError情况的区域。
1.2
Java虚拟机栈
与程序计数器一样,Java虚拟机栈也是线程私有的,其生命周期与线程相同。
如何理解虚拟机栈呢?
本质上来讲,就是个栈。里面存放的元素叫栈帧,栈帧好像很复杂的样子,其实它很简单!它里面存放的是一个函数的上下文,具体存放的是执行的函数的一些数据。执行的函数需要的数据无非就是局部变量表(保存函数内部的变量)、操作数栈(执行引擎计算时需要),方法出口等等。
执行引擎每调用一个函数时,就为这个函数创建一个栈帧,并加入虚拟机栈。换个角度理解,每个函数从调用到执行结束,其实是对应一个栈帧的入栈和出栈。
注意这个区域可能出现的两种异常:
一种是StackOverflowError,当前线程请求的栈深度大于虚拟机所允许的深度时,会抛出这个异常。制造这种异常很简单:将一个函数反复递归自己,最终会出现栈溢出错误(StackOverflowError)。
另一种异常是OutOfMemoryError异常,当虚拟机栈可以动态扩展时(当前大部分虚拟机都可以),如果无法申请足够多的内存就会抛出OutOfMemoryError,如何制作虚拟机栈OOM呢,参考一下代码:
这段代码有风险,可能会导致操作系统假死,请谨慎使用~~~
1.3
本地方法栈
本地方法栈与虚拟机所发挥的作用很相似,他们的区别在于虚拟机栈为执行Java代码方法服务,而本地方法栈是为Native方法服务。与虚拟机栈一样,本地方法栈也会抛出StackOverflowError和OutOfMemoryError异常。
1.4
Java堆
Java堆可以说是虚拟机中最大一块内存了。它是所有线程所共享的内存区域,几乎所有的实例对象都是在这块区域中存放。当然,随着JIT编译器的发展,所有对象在堆上分配渐渐变得不那么“绝对”了。
Java堆是垃圾收集器管理的主要区域。由于现在的收集器基本上采用的都是分代收集算法,所有Java堆可以细分为:新生代和老年代。在细致分就是把新生代分为:Eden空间、From Survivor空间、To Survivor空间。当堆无法再扩展时,会抛出OutOfMemoryError异常。
1.5
方法区
方法区存放的是类信息、常量、静态变量等。方法区是各个线程共享区域,很容易理解,我们在写Java代码时,每个线程度可以访问同一个类的静态变量对象。由于使用反射机制的原因,虚拟机很难推测那个类信息不再使用,因此这块区域的回收很难。另外,对这块区域主要是针对常量池回收,值得注意的是JDK1.7已经把常量池转移到堆里面了。同样,当方法区无法满足内存分配需求时,会抛出OutOfMemoryError。
制造方法区内存溢出,注意,必须在JDK1.6及之前版本才会导致方法区溢出,原因后面解释,执行之前,可以把虚拟机的参数-XXpermSize和-XX:MaxPermSize限制方法区大小。
运行后会抛出java.lang.OutOfMemoryError:PermGen space异常。
解释一下,String的intern()函数作用是如果当前的字符串在常量池中不存在,则放入到常量池中。上面的代码不断将字符串添加到常量池,最终肯定会导致内存不足,抛出方法区的OOM。
下面解释一下,为什么必须将上面的代码在JDK1.6之前运行。我们前面提到,JDK1.7后,把常量池放入到堆空间中,这导致intern()函数的功能不同,具体怎么个不同法,且看看下面代码:
这段代码在JDK1.6和JDK1.7运行的结果不同。
JDK1.6结果是:false,false ,JDK1.7结果是true, false。
原因是:JDK1.6中,intern()方法会吧首次遇到的字符串实例复制到常量池中,返回的也是常量池中的字符串的引用,而StringBuilder创建的字符串实例是在堆上面,所以必然不是同一个引用,返回false。
在JDK1.7中,intern不再复制实例,常量池中只保存首次出现的实例的引用,因此intern()返回的引用和由StringBuilder创建的字符串实例是同一个。为什么对str2比较返回的是false呢?这是因为,JVM中内部在加载类的时候,就已经有“java“这个字符串,不符合“首次出现”的原则,因此返回false。

jvm,jmap分析工具有哪些如何来分析tomcat宕机


  可以先统计一下访问日志,看看哪些请求的响应时间最长,然后跟进这些请求,掐时间,找到最耗时的操作,解决它,再掐时间解决最耗时的操作。
  可以先用工具(假设是在linux上)看一下操作系统当前的各项指标,top,vmstat,sar啥的。
  打开gc的日志(-XX:+PrintGCDetails, -XX:+PrintGCTimeStamps , -Xloggc:/var/log/gc.log啥的),运行一段时间,看看gc的情况。之前有一个GCViewer的工具可以图形化的展示gc日志,不知道现在是否还能使用。
  如果操作系统还挺闲,那应该是业务实现导致系统无法提供服务。题主使用jstack看一下系统都在干什么,看看是否有死锁或者同步操作的问题。另外,如果用到DB了,还需要看看是否有slow-sql啥的。

推荐阅读