`

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
分享到:
评论

相关推荐

    JDK17-Linux-Arm64

    6. **弃用的HTTP客户端API(Deprecated HTTP Client API)**:JDK9引入的HttpURLConnection被标记为过时,鼓励开发者使用更现代的HttpClient API。 7. **增强的垃圾收集器(Garbage Collectors)**:包括ZGC和...

    JDK/JRE 17.0.5

    **JDK/JRE 17.0.5详解** Java Development Kit (JDK) 和 Java Runtime Environment (JRE) 是Java编程语言的核心组件,对于任何Java开发者和用户来说都至关重要。JDK 17.0.5是Oracle公司发布的最新版本,提供了对...

    jdk1.6.0_20

    1. 改进的动态代理:在JDK 1.6中,Java的动态代理得到了增强,可以更方便地创建代理类,这对于实现AOP(面向切面编程)和其他设计模式提供了便利。 2. 新的Swing组件和改进:此版本增加了新的Swing组件,如...

    JDK-11.0.11

    1. **Java Runtime Environment (JRE)**:JRE是JDK的基础,提供了运行Java程序所需的环境。它包括Java虚拟机(JVM)、类库以及支持Java程序运行所需的其他文件。JVM是Java程序执行的引擎,负责解释和执行字节码。 2...

    让天下没有难做的JVM.pdf

    JVM有两种运行模式:Server模式和Client模式。Server模式适合长时间运行的服务器端应用程序,具有更多的优化,启动虽然慢,但运行速度快;Client模式适合桌面应用程序,启动速度快,但运行性能相对较低。在了解JVM...

    JDK1.6版本下载

    1. **编译器优化**:JDK 1.6的编译器进行了显著优化,名为“Client Compiler”和“Server Compiler”的两种编译模式提供更好的性能适应性。Server Compiler在多线程应用中表现出色,而Client Compiler适合轻量级的...

    jdk-20-linux-x64-bin.tar.gz

    在JDK 20中,开发者可以期待看到如模式匹配(Pattern Matching)这样的语言增强,它使代码更简洁、可读性更强。 2. **Linux x64支持** 这个版本的JDK是专为64位Linux操作系统设计的,意味着它可以充分利用64位系统...

    1.6JDK 32/64安装包

    在性能方面,JDK 1.6的HotSpot JVM引入了Client和Server两种模式,分别针对桌面应用和服务器环境优化。Server模式下,JVM会启动更复杂的优化策略,提高大型应用的性能。 此外,JDK 1.6还增强了异常处理,提供了更...

    jvm内存参数调优

    在64位的JDK环境下,默认启用的是-server模式,即使指定了-client参数也会被忽略。 ##### 2.2 -agentlib 和 -agentpath - **-agentlib:libname[=options]**:用于装载本地库。其中`libname`为本地代理库文件名,如...

    jdk1.6.0.43/src.zip

    2. 学习设计模式:JDK源代码中充满了设计模式的应用,如工厂模式、单例模式、装饰器模式等,这些都是提升编程能力的宝贵资源。 3. 性能优化:通过分析JVM和垃圾收集器的源代码,我们可以学习如何优化程序性能,减少...

    ubuntu安装JDK教程

    1 /usr/lib/jvm/java-6-openjdk/jre/bin/java 1061 手动模式 * 2 /usr/lib/jvm/java-6-sun/bin/java 300 手动模式 ``` 3. **确认Java版本**:最后,可以通过`java -version`命令验证安装是否成功。 ```shell ...

    ubuntu配置jdk环境

    export JRE_HOME=/usr/local/jdk1.7.0_80/jre export CLASSPATH=.:$CLASSPATH:$JAVA_HOME/lib:$JRE_HOME/lib export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin ``` 这些环境变量的设置是确保系统能够找到JDK的安装...

    jdk-8u261-windows-i586.rar

    5. **改进的JVM性能**:JDK 8对垃圾回收机制进行了优化,提升了程序运行效率。 **安装步骤** 1. **下载**:首先,从Oracle官方网站获取“jdk-8u261-windows-i586.exe”文件,确保下载的是32位版本,适合Windows 32...

    jdk1.8.0.13

    - **Java运行时环境 (JRE)**:包括JVM和Java核心类库,为Java程序提供运行时环境。 - **Java工具**:如Javadoc(生成API文档)、JAR(打包工具)、JDB(调试工具)等,辅助开发过程。 **3. JDK 1.8.0.13的具体改进...

    jdk-14.0.2.zip

    这个可执行文件将安装JDK的全部组件,包括Java编译器(javac)、Java运行时环境(JRE)、Java虚拟机(JVM)、Java文档(javadoc)、Java打包工具(jar)以及其他必要的库和工具。 1. **新特性与改进**:JDK 14引入...

    JVM启动参数应用集合

    `-client` 和 `-server` 参数用于选择JVM的执行模式。`-client` 模式适用于桌面应用或开发调试,因为它启动速度快,但运行时性能较低。相反,`-server` 模式适合服务器端应用,提供更好的运行时性能和内存管理,但...

    JVM实用参数

    - **类型**:`client`,HotSpot JVM有两种类型——`server`和`client`,可以通过`-server`和`-client`参数来指定。如果不指定,则JVM会根据系统自动选择类型。通常,32位系统默认为`client`模式,64位系统默认为`...

    jdk1.6.0_43.zip

    Java Development Kit(JDK)是Java编程语言的核心组件,它为开发者提供了编译、调试和运行Java应用程序所需的所有...通过解压缩并设置环境变量,开发者可以轻松地在本地环境中使用这个版本的JDK进行开发和调试工作。

    最新版windows jdk-18_windows-x64_bin.zip

    JDK 18是Java语言的一个重要版本,它包含了Java编译器、JVM(Java虚拟机)、JRE(Java运行环境)以及各种开发工具,如Javadoc、JConsole和VisualVM等。这个版本主要关注新特性的引入和现有特性的改进,旨在提升...

    jdk7 jdk-7u80-windows-x64 网盘下载

    JDK 7是在JDK 6的基础上进行了一系列改进与增强,引入了许多新功能和技术,为开发者提供了更加丰富的编程工具。 #### 二、JDK 7 的主要新特性 1. **模块系统**:虽然JDK 7中的模块系统(Project Jigsaw)并未完全...

Global site tag (gtag.js) - Google Analytics