`

JRE 与 JDK ,JVM client模式与server模式

    博客分类:
  • Java
阅读更多

本文大部分内容转载自:JRE 与 JDK ,JVM Client Server了解

介绍JVM client模式与server模式的文章有:

http://phl.iteye.com/blog/857587

http://rednaxelafx.iteye.com/blog/1007251

http://developer.51cto.com/art/201009/228035.htm

一、JRE: java runtime environment  java 运行环境
JRE是运行java所需要的环境。包含JVM标准实现和JAVA核心类库,以及javaplug-in。
可以在JRE上进行运行、测试和传输应用程序。JRE不包括编译器,调试器和其他工具。
也就是说,如果直接运行一个java编译好了的class文件,使用JRE就OK 了。
但是如果你要开发一个java文件,然后对它进行编译,调试等工作,这个时候就要用到JDK 了。


二、JDK: java development kit      java 开发工具包
java开发人员对这个并不陌生,在创建开发环境的时候首要安装的就是JDK,配置环境变量JAVA_HOME ,指向JDK。
在安装JDK的后,你会发现jdk的目录下有一个jre的目录,也就是说,JDK里面包含一个JRE。这样开发了的程序可以编译后直接运行了。
JDK 有三种版本,常说的J2EE(java 2 platform Enterprise edition),J2SE(java 2 platform standyard edition),
J2ME(java 2 platform micro edition)就是说的JDK 的版本。
JDK 除了核心的java api库和jre外,还包括一些程序组成的工具库(jdk的安装目录bin下可以看到),在这里挑几个简单了解下:
1.javac:java的编译器,可以将java文件编译成字节码
2.java: java的解释器,可以将字节码进行解释运行。
3.jdb:   java 调试器,可以设置断点和检查变量,逐行运行程序。
4.javah:产生可以调用java过程的c过程,或建立能被java程序调用的C过程头文件。这个我没用过。暂时理解为C 与 java之间的翻译吧。
5.Javap:java反汇编器,显示编译类文件中的可访问功能和数据,同时显示字节码的含义。其实个人感觉叫javap反汇编或反编译器比较别扭。
因为javap毕竟不像其他的反编译工具一样将class文件的直接转成java文件,而只能显示方法的名称,不包括具体实现。
我感觉javap还是作为解释class文件的。如果你没有这个class文件的api,没有ide,想在命令行操作里面查看这个class文件都包括什么方法
那javap还是很简单操作的,你可以直接调用任何一个JDK中本身有的类来进行测试,如

javap  -private java.lang.Object

  

我这里自己写了一个Test类来进行测试,如下所示:

 

类Test.java的源代码如下所示:


import java.io.IOException;
public class Test{
	
	public static void main(String[] args){
				System.out.println("I'm running!");
		}
	
	public void test1(){}
	
	private void test2(){}
	
	public void test3() throws IOException{}
	}


 javap 根据传递的不同参数展示不同的内容,如下所示:


D:\>javap -private Test
Compiled from "Test.java"
public class Test extends java.lang.Object{
    public Test();
    public static void main(java.lang.String[]);
    public void test1();
    private void test2();
    public void test3()       throws java.io.IOException;
}


D:\>javap -public Test
Compiled from "Test.java"
public class Test extends java.lang.Object{
    public Test();
    public static void main(java.lang.String[]);
    public void test1();
    public void test3()       throws java.io.IOException;
}


D:\>javap -verbose Test
Compiled from "Test.java"
public class Test extends java.lang.Object
  SourceFile: "Test.java"
  minor version: 0
  major version: 50
  Constant pool:
const #1 = Method       #6.#20; //  java/lang/Object."<init>":()V
const #2 = Field        #21.#22;        //  java/lang/System.out:Ljava/io/PrintS
tream;
const #3 = String       #23;    //  I'm running!
const #4 = Method       #24.#25;        //  java/io/PrintStream.println:(Ljava/l
ang/String;)V
const #5 = class        #26;    //  Test
const #6 = class        #27;    //  java/lang/Object
const #7 = Asciz        <init>;
const #8 = Asciz        ()V;
const #9 = Asciz        Code;
const #10 = Asciz       LineNumberTable;
const #11 = Asciz       main;
const #12 = Asciz       ([Ljava/lang/String;)V;
const #13 = Asciz       test1;
const #14 = Asciz       test2;
const #15 = Asciz       test3;
const #16 = Asciz       Exceptions;
const #17 = class       #28;    //  java/io/IOException
const #18 = Asciz       SourceFile;
const #19 = Asciz       Test.java;
const #20 = NameAndType #7:#8;//  "<init>":()V
const #21 = class       #29;    //  java/lang/System
const #22 = NameAndType #30:#31;//  out:Ljava/io/PrintStream;
const #23 = Asciz       I'm running!;
const #24 = class       #32;    //  java/io/PrintStream
const #25 = NameAndType #33:#34;//  println:(Ljava/lang/String;)V
const #26 = Asciz       Test;
const #27 = Asciz       java/lang/Object;
const #28 = Asciz       java/io/IOException;
const #29 = Asciz       java/lang/System;
const #30 = Asciz       out;
const #31 = Asciz       Ljava/io/PrintStream;;
const #32 = Asciz       java/io/PrintStream;
const #33 = Asciz       println;
const #34 = Asciz       (Ljava/lang/String;)V;

{
public Test();
  Code:
   Stack=1, Locals=1, Args_size=1
   0:   aload_0
   1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
   4:   return
  LineNumberTable:
   line 2: 0


public static void main(java.lang.String[]);
  Code:
   Stack=2, Locals=1, Args_size=1
   0:   getstatic       #2; //Field java/lang/System.out:Ljava/io/PrintStream;
   3:   ldc     #3; //String I'm running!
   5:   invokevirtual   #4; //Method java/io/PrintStream.println:(Ljava/lang/Str
ing;)V
   8:   return
  LineNumberTable:
   line 5: 0
   line 6: 8


public void test1();
  Code:
   Stack=0, Locals=1, Args_size=1
   0:   return
  LineNumberTable:
   line 8: 0


public void test3()   throws java.io.IOException;
  Code:
   Stack=0, Locals=1, Args_size=1
   0:   return
  LineNumberTable:
   line 12: 0

  Exceptions:
   throws java.io.IOException
}


可以使用javap -help来查看javap的各的具体参数如下所示:

 


D:\>javap -help
Usage: javap <options> <classes>...

where options include:
   -c                        Disassemble the code
   -classpath <pathlist>     Specify where to find user class files
   -extdirs <dirs>           Override location of installed extensions
   -help                     Print this usage message
   -J<flag>                  Pass <flag> directly to the runtime system
   -l                        Print line number and local variable tables
   -public                   Show only public classes and members
   -protected                Show protected/public classes and members
   -package                  Show package/protected/public classes
                             and members (default)
   -private                  Show all classes and members
   -s                        Print internal type signatures
   -bootclasspath <pathlist> Override location of class files loaded
                             by the bootstrap class loader
   -verbose                  Print stack size, number of locals and args for met
hods
                             If verifying, print reasons for failure

 

 6. Jconsole: Java进行系统调试和监控的工具

7.jstat : 对jvm的内存使用量进行监控,感觉这个东西很好,正好这几天看java虚拟机,如果不安装其他工具,使用jstat就可以监控到jvm内容使用的情况和GC状况,对于jvm调优很有帮助:

8.jmap - Memory Map: Prints shared object memory maps or heap memory details of a given JVM process or a Java core file on the local machine or on a remote machine through a debug server。

jmap 能够打印出jvm的内存使用详情,也可以把这些详情输出到特定的文件中进行分析


9.native2ascii  可以将目标文件转成unicode 编码,或者将unicode编码的文件还原成本地编码,也可以指定编码进行转换。


三、JVM client模式与server模式

 下面整理一下对JVM client 和server 的一点点了解:

  1.虚拟机版本与模式查看 

 

java -version //查看JVM默认的环境 
java -client -version //查看JVM的客户端环境,针对GUI优化,启动速度快,运行速度不如server 
java -server -version //查看JVM的服务器端环境,针对生产环境优化,运行速度快,启动速度慢 

    使用各命令查看时的情况,如下图所示:

 

 

 

2、虚拟机模式切换 

  目录JAVA_HOME/jre/bin下,会有2个目录,server与client.这个就是他们的运行环境的动态库.如我的机器就是:C:\Java\jdk1.6.0_17\jre\bin.找到JAVA_HOME/jre/lib/i386/jvm.cfg(我的机器是C:\Java\jdk1.6.0_17\jre\lib/i386/jvm.cfg)这就是JVM默认的查找顺序,内容如下 

-client KNOWN 
-server KNOWN 
-hotspot ALIASED_TO -client 
-classic WARN 
-native ERROR 
-green ERROR 
 默认启动的时候是使用第一行的启动,或者你可以加参数 java -client className 进行启动,来定制自己时使用clent还是server。你可以在命令行中直接输入java或java -help命令,你会看到如下的内容:


    
     这时你只需要把-server和-clent换个位置就行了.就可以切换他们的启动顺序,如下所示:  
-server KNOWN 
-client KNOWN 
-hotspot ALIASED_TO -client 
-classic WARN 
-native ERROR 
-green ERROR 
  这个时候再输入java -version,可以看到是默认的使用服务器端了。


 

3.虚拟机模式的区别:

一般开发工具中使用的是client,针对不同的服务器使用的不同,

jvm server比jvm client 更优化,

jvm server 启动较慢但启动后运行速度较快。jvm client  启动较快。

jvm client 中能运行的可能在jvm server中运行出错 ,所以这样的话最好在开发、测试阶段都使用jvm server ,保持和服务器相同。不过一直用client,也没出现过什么问题,服务器端用的是server的。可能这种高技术含量的bug相当不容易出现了。

       JVM Server模式与client模式启动,最主要的差别在于:-Server模式启动时,速度较慢,但是一旦运行起来后,性能将会有很大的提升。JVM如果不显式指定是-Server模式还是-client模式。

 

PS:但我在我同事的机器上,他的java的版本是1.6.0.32-b05,在他的机器上运行命令java -server -version时会产生如下所示的错误:

 

  所以修改JAVA_HOME/jre/lib/i386/jvm.cfg下面-server和-client的顺序也是报同样的错误,但我看了安装jdk目录下面的文件我的机器的文件目录一样的。当我直接把他的C:\Java\jdk1.6\jre\bin下面的server文件夹内容拷贝到C:\Java\jre6\bi下面的时候,这时就能实现与我在jdk1.6.0_17实验的结果。
 

4.遇到的因为虚拟机模式产生的问题

   当我在jdk1.6.0_17+tomcat3.0的Tomcat环境下跑得好好的程序,当我把jdk版本升级到1.6.0.32时,结果就遇到了如下所示的问题:

 

 

# A fatal error has been detected by the Java Runtime Environment:
#
#  Internal Error (c1_Optimizer.cpp:271), pid=5124, tid=2376
#  guarantee(x_compare_res != Constant::not_comparable) failed: incomparable constants in IfOp
#
# JRE version: 6.0_32-b05
# Java VM: Java HotSpot(TM) Client VM (20.7-b02 mixed mode windows-x86 )

    每次一启动Tomcat就会出现上面所示的错误,在tomcat\bin目录下面会产生一个错误日志文件,如: hs_err_pid824.log,然后tomcat就自动停止了。

解决办法:

当程序以-server的模式启动问题就能得到解决 ,程序就能正常启动了。

    1.在tomcat\bin\catalina.bat 文件中给JAVA_OPTS加一个-server的参数,让其以server的方式启动。如下所示:

 

 

rem ----- Execute The Requested Command ---------------------------------------
set JAVA_OPTS=-server -Xms256m  -Xmx1224m -XX:PermSize=64M -XX:MaxNewSize=256m -XX:MaxPermSize=128m -Djava.awt.headless=true
echo Using CATALINA_BASE:   "%CATALINA_BASE%"
echo Using CATALINA_HOME:   "%CATALINA_HOME%"
echo Using CATALINA_TMPDIR: "%CATALINA_TMPDIR%"
if ""%1"" == ""debug"" goto use_jdk
echo Using JRE_HOME:        "%JRE_HOME%"
goto java_dir_displayed
:use_jdk
echo Using JAVA_HOME:       "%JAVA_HOME%"
:java_dir_displayed
echo Using CLASSPATH:       "%CLASSPATH%"

 

2.修改JAVA_HOME/jre/lib/i386/jvm.cfg文件,把-server KNOWN语句放在-client KNOWN前面,如下所示:

 

-server KNOWN
-client KNOWN
-hotspot ALIASED_TO -client
-classic WARN
-native ERROR
-green ERROR
 

3.在eclipse配置tomcat server的地方设置jdk的启动参数,如下图所示:

 


  • 大小: 8.5 KB
  • 大小: 4.7 KB
  • 大小: 2.8 KB
  • 大小: 17.7 KB
  • 大小: 17.6 KB
分享到:
评论

相关推荐

    Java面试题及答案大全(2023持续更新)

    分别是:「Java 基础、容器、多线程、反射、对象拷贝、Java Web 、异常、网络、设计模式、Spring/Spring MVC、Spring Boot/Spring Cloud、Hibernate、MyBatis、RabbitMQ、Kafka、Zookeeper、MySQL、Redis、JVM」 ...

    一次性精通JVM JAVA虚拟机

    第1章 基础入门,从JVM是什么开始讲起,理解JDK、JRE、JVM的关系,java的编译流程和执行流程,让您轻松入门。 第2章 字节码文件,深入剖析字节码文件的全部组成结构,以及javap和jbe可视化反解析工具的使用。 第3章 ...

    java面试题

    49. JDK,JRE,JVM的区别? 22 50. Java中常见类,方法,接口 23 51. 多线程 23 51.1. 线程的基本概念 23 51.2. Java中的线程有四种状态 23 51.3. 多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么? 24 ...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    实例005 下载并安装JRE执行环境 8 实例006 编程输出星号组成的等腰三角形 9 1.2 开发工具 11 实例007 下载最新的Eclipse 11 实例008 为最新的Eclipse安装中文语言包 12 实例009 活用Eclipse的工作空间 14 实例010 在...

    新版Android开发教程.rar

    o JDK 5 or JDK 6 (JRE alone is not sufficient) o Apache Ant 1.6.5 or later for Linux and Mac, 1.7 or later for Windows o Not Not Not Not compatible with Gnu Compiler for Java (gcj) Note: Note: Note: ...

    Java常见面试题208道.docx

    Java 基础、容器、多线程、反射、对象拷贝、Java Web 模块、异常、网络、设计模式、Spring/Spring MVC、Spring Boot/Spring Cloud、Hibernate、Mybatis、RabbitMQ、Kafka、Zookeeper、MySql、Redis、JVM 。...

    Java经典入门教程pdf完整版

    取数据库的 JDBC API、 CORBA技术以及能够在 Internet应用中保护数据的安全模式等等, 同时还提供了对BJB( Enterprise java beans)、 Java Servlets aPi、JSP( Java Server pages) 以及ⅫML技术的全面攴持。其最终...

Global site tag (gtag.js) - Google Analytics