- 浏览: 771302 次
- 性别:
- 来自: 西安
文章分类
最新评论
-
wangyudong:
新版本 Wisdom RESTClienthttps://gi ...
jersery client调用REST框架web services服务的一个示例 -
wangyudong:
很多REST Client是不支持自动化测试RESTful A ...
jersery client调用REST框架web services服务的一个示例 -
doubledumbao:
感谢你的代码,在使用中发现两处小问题,已经做了修改,再次感谢。 ...
Java Zip Utils 压缩/解压缩工具包 -
doubledumbao:
package com.ry.messagedigest;
...
Java Zip Utils 压缩/解压缩工具包 -
phrmgb:
对wsdl讲解的很细致,收藏
Web Service (二) WSDL详解
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
-server KNOWN -client KNOWN -hotspot ALIASED_TO -client -classic WARN -native ERROR -green ERROR
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的启动参数,如下图所示:
发表评论
-
java 中JSON数据特殊字符的处理
2014-05-05 18:41 6863JSon 数据中的String 传递数据时,需要处理好特殊 ... -
Java Zip Utils 压缩/解压缩工具包
2014-05-05 11:27 6924实际开发中可能会用到压缩或解压缩,底层借助于apache的z ... -
edtFtp实现FTP工具类
2012-10-11 11:22 1218edtFtp是一个开源的纯Java的FTP客户端类库。由于它实 ... -
Java class文件的JDK编译版本号
2012-10-11 09:30 1811本人转载自新浪博客,原文地址:http://blog.sina ... -
TOMCAT支持J2EE版本问题
2012-09-03 18:33 6977j2ee1.4 支持的是servlet2.4,j ... -
SimpleDateFormat 线程安全的问题
2012-05-25 18:10 1263SimpleDateFormat中的日期 ... -
Java编程中“为了性能”尽量要做到的一些地方
2012-05-17 08:48 834这篇文章COPY自:http://www.iteye.c ... -
分享一个文件监听器类:FileMonitor
2011-06-17 15:51 3862一直使用tomcat开发,只要将<Context ... -
在eclipse中给jar关联相应的源文件(Source)
2011-05-09 17:17 6731以给commons.dbcp.jar关联源文件为例进行说明。 ... -
tomcat的启动内存设置
2011-05-07 17:16 1106转载自:http://blog.csdn.net/chen ... -
java调用sql server存储过程
2011-05-06 17:21 3429为了便于测试,先创建一个简单的表: CREATE TA ... -
session过期问题
2010-12-16 11:43 1213摘自:http://dev.firnow.com/course ... -
awttest
2010-12-06 22:20 0protected void doPost(Htt ... -
java环境变量设置
2010-07-01 22:01 3200windows xp下配置JDK环境变量: 1.安装JD ... -
一个删除指定目录下所有文件及子目录的Java程序
2010-05-04 14:30 6866今天在je上闲逛时,看到很多人分享的一个删除指定目录下所有文件 ... -
Publishing failed with multiple errors和Timeout waiting for Tomcat v5.5的解决方法
2010-04-27 14:59 2175转载自:http://sucre.iteye.com/bl ... -
eclipse注释规范设置
2010-04-13 14:57 1783本文来自CSDN博客,转载请标明出处:http://blog. ... -
String , StringBuffer, StringBuilder的区别
2010-03-03 17:38 3492转载自:http://www.cnblogs.com/liuy ... -
解决一台机器同时运行多个Tomcat服务
2010-03-03 15:36 1248转载自: http://www.cnblog ... -
如何生成javadoc文档
2010-03-03 15:31 5496编写Javadoc 代码 在Java 代码的类、 ...
相关推荐
分别是:「Java 基础、容器、多线程、反射、对象拷贝、Java Web 、异常、网络、设计模式、Spring/Spring MVC、Spring Boot/Spring Cloud、Hibernate、MyBatis、RabbitMQ、Kafka、Zookeeper、MySQL、Redis、JVM」 ...
第1章 基础入门,从JVM是什么开始讲起,理解JDK、JRE、JVM的关系,java的编译流程和执行流程,让您轻松入门。 第2章 字节码文件,深入剖析字节码文件的全部组成结构,以及javap和jbe可视化反解析工具的使用。 第3章 ...
49. JDK,JRE,JVM的区别? 22 50. Java中常见类,方法,接口 23 51. 多线程 23 51.1. 线程的基本概念 23 51.2. Java中的线程有四种状态 23 51.3. 多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么? 24 ...
实例005 下载并安装JRE执行环境 8 实例006 编程输出星号组成的等腰三角形 9 1.2 开发工具 11 实例007 下载最新的Eclipse 11 实例008 为最新的Eclipse安装中文语言包 12 实例009 活用Eclipse的工作空间 14 实例010 在...
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 基础、容器、多线程、反射、对象拷贝、Java Web 模块、异常、网络、设计模式、Spring/Spring MVC、Spring Boot/Spring Cloud、Hibernate、Mybatis、RabbitMQ、Kafka、Zookeeper、MySql、Redis、JVM 。...
取数据库的 JDBC API、 CORBA技术以及能够在 Internet应用中保护数据的安全模式等等, 同时还提供了对BJB( Enterprise java beans)、 Java Servlets aPi、JSP( Java Server pages) 以及ⅫML技术的全面攴持。其最终...