什么是 Java 虚拟机?
您好,提问者: Java虚拟机简称JVM,它的作用如下: 1、其实Java不可跨平台,真正实现跨平台的是JVM虚拟机。 2、JVM其实就是一个编译java、运行class的一个跟操作系统的一个软件。 3、JVM的作用只针对于Java,而系统中的东西与它无关。 4、其实说白了就是一个软件,就像VMware一样。Java虚拟机 一、什么是Java虚拟机 Java虚拟机是一个想象中的机器,在实际的计算机上通过软件模拟来实现。Java虚拟机有自己想象中的硬件,如处理器、堆栈、寄存器等,还具有相应的指令系统。 为什么要使用Java虚拟机 Java语言的一个非常重要的特点就是与平台的无关性。而使用Java虚拟机是实现这一特点的关键。一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的目标代码。而引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用模式Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。Java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。 2.谁需要了解Java虚拟机 Java虚拟机是Java语言底层实现的基础,对Java语言感兴趣的人都应对Java虚拟机有个大概的了解。这有助于理解Java语言的一些性质,也有助于使用Java语言。对于要在特定平台上实现Java虚拟机的软件人员,Java语言的编译器作者以及要用硬件芯片实现Java虚拟机的人来说,则必须深刻理解Java虚拟机的规范。另外,如果你想扩展Java语言,或是把其它语言编译成Java语言的字节码,你也需要深入地了解Java虚拟机。 3.Java虚拟机支持的数据类型 Java虚拟机支持Java语言的基本数据类型如下: byte://1字节有符号整数的补码 short://2字节有符号整数的补码 int://4字节有符号整数的补码 long://8字节有符号整数的补码 float://4字节IEEE754单精度浮点数 double://8字节IEEE754双精度浮点数 char://2字节无符号Unicode字符 几乎所有的Java类型检查都是在编译时完成的。上面列出的原始数据类型的数据在Java执行时不需要用硬件标记。操作这些原始数据类型数据的字节码(指令)本身就已经指出了操作数的数据类型,例如iadd、ladd、fadd和dadd指令都是把两个数相加,其操作数类型别是int、long、float和double。虚拟机没有给boolean(布尔)类型设置单独的指令。boolean型的数据是由integer指令,包括integer返回来处理的。boolean型的数组则是用byte数组来处理的。虚拟机使用IEEE754格式的浮点数。不支持IEEE格式的较旧的计算机,在运行Java数值计算程序时,可能会非常慢。 虚拟机支持的其它数据类型包括: object//对一个Javaobject(对象)的4字节引用 returnAddress//4字节,用于jsr/ret/jsr-w/ret-w指令 注:Java数组被当作object处理。 虚拟机的规范对于object内部的结构没有任何特殊的要求。在Sun公司的实现中,对object的引用是一个句柄,其中包含一对指针:一个指针指向该object的方法表,另一个指向该object的数据。用Java虚拟机的字节码表示的程序应该遵守类型规定。Java虚拟机的实现应拒绝执行违反了类型规定的字节码程序。Java虚拟机由于字节码定义的限制似乎只能运行于32位地址空间的机器上。但是可以创建一个Java虚拟机,它自动地把字节码转换成64位的形式。从Java虚拟机支持的数据类型可以看出,Java对数据类型的内部格式进行了严格规定,这样使得各种Java虚拟机的实现对数据的解释是相同的,从而保证了Java的与平台无关性和可 移植性。 二、Java虚拟机体系结构 Java虚拟机由五个部分组成:一组指令集、一组寄存器、一个栈、一个无用单元收集堆(Garbage-collected-heap)、一个方法区域。这五部分是Java虚拟机的逻辑成份,不依赖任何实现技术或组织方式,但它们的功能必须在真实机器上以某种方式实现。 Java指令集 Java虚拟机支持大约248个字节码。每个字节码执行一种基本的CPU运算,例如,把一个整数加到寄存器,子程序转移等。Java指令集相当于Java程序的汇编语言。 Java指令集中的指令包含一个单字节的操作符,用于指定要执行的操作,还有0个或多个操作数,提供操作所需的参数或数据。许多指令没有操作数,仅由一个单字节的操作符构成。 虚拟机的内层循环的执行过程如下: do{ 取一个操作符字节; 根据操作符的值执行一个动作; }while(程序未结束) 由于指令系统的简单性,使得虚拟机执行的过程十分简单,从而有利于提高执行的效率。指令中操作数的数量和大小是由操作符决定的。如果操作数比一个字节大,那么它存储的顺序是高位字节优先。例如,一个16位的参数存放时占用两个字节,其值为: 第一个字节*256+第二个字节字节码指令流一般只是字节对齐的。指令tabltch和lookup是例外,在这两条指令内部要求强制的4字节边界对齐。 2.寄存器 Java虚拟机的寄存器用于保存机器的运行状态,与微处理器中的某些专用寄存器类似。 Java虚拟机的寄存器有四种: pc:Java程序计数器。 optop:指向操作数栈顶端的指针。 frame:指向当前执行方法的执行环境的指针。 vars:指向当前执行方法的局部变量区第一个变量的指针。 Java虚拟机 Java虚拟机是栈式的,它不定义或使用寄存器来传递或接受参数,其目的是为了保证指令集的简洁性和实现时的高效性(特别是对于寄存器数目不多的处理器)。 所有寄存器都是32位的。 3.栈 Java虚拟机的栈有三个区域:局部变量区、运行环境区、操作数区。 (1)局部变量区 每个Java方法使用一个固定大小的局部变量集。它们按照与vars寄存器的字偏移量来寻址。局部变量都是32位的。长整数和双精度浮点数占据了两个局部变量的空间,却按照第一个局部变量的索引来寻址。(例如,一个具有索引n的局部变量,如果是一个双精度浮点数,那么它实际占据了索引n和n+1所代表的存储空间。)虚拟机规范并不要求在局部变量中的64位的值是64位对齐的。虚拟机提供了把局部变量中的值装载到操作数栈的指令,也提供了把操作数栈中的值写入局部变量的指令。 (2)运行环境区 在运行环境中包含的信息用于动态链接,正常的方法返回以及异常传播。 ·动态链接 运行环境包括对指向当前类和当前方法的解释器符号表的指针,用于支持方法代码的动态链接。方法的class文件代码在引用要调用的方法和要访问的变量时使用符号。动态链接把符号形式的方法调用翻译成实际方法调用,装载必要的类以解释还没有定义的符号,并把变量访问翻译成与这些变量运行时的存储结构相应的偏移地址。动态链接方法和变量使得方法中使用的其它类的变化不会影响到本程序的代码。 ·正常的方法返回 如果当前方法正常地结束了,在执行了一条具有正确类型的返回指令时,调用的方法会得到一个返回值。执行环境在正常返回的情况下用于恢复调用者的寄存器,并把调用者的程序计数器增加一个恰当的数值,以跳过已执行过的方法调用指令,然后在调用者的执行环境中继续执行下去。 ·异常和错误传播 异常情况在Java中被称作Error(错误)或Exception(异常),是Throwable类的子类,在程序中的原因是:①动态链接错,如无法找到所需的class文件。②运行时错,如对一个空指针的引用 ·程序使用了throw语句。 当异常发生时,Java虚拟机采取如下措施: ·检查与当前方法相联系的catch子句表。每个catch子句包含其有效指令范围,能够处理的异常类型,以及处理异常的代码块地址。 ·与异常相匹配的catch子句应该符合下面的条件:造成异常的指令在其指令范围之内,发生的异常类型是其能处理的异常类型的子类型。如果找到了匹配的catch子句,那么系统转移到指定的异常处理块处执行;如果没有找到异常处理块,重复寻找匹配的catch子句的过程,直到当前方法的所有嵌套的catch子句都被检查过。 ·由于虚拟机从第一个匹配的catch子句处继续执行,所以catch子句表中的顺序是很重要的。因为Java代码是结构化的,因此总可以把某个方法的所有的异常处理器都按序排列到一个表中,对任意可能的程序计数器的值,都可以用线性的顺序找到合适的异常处理块,以处理在该程序计数器值下发生的异常情况。 ·如果找不到匹配的catch子句,那么当前方法得到一个"未截获异常"的结果并返回到当前方法的调用者,好像异常刚刚在其调用者中发生一样。如果在调用者中仍然没有找到相应的异常处理块,那么这种错误传播将被继续下去。如果错误被传播到最顶层,那么系统将调用一个缺省的异常处理块。 (3)操作数栈区 机器指令只从操作数栈中取操作数,对它们进行操作,并把结果返回到栈中。选择栈结构的原因是:在只有少量寄存器或非通用寄存器的机器(如Intel486)上,也能够高效地模拟虚拟机的行为。操作数栈是32位的。它用于给方法传递参数,并从方法接收结果,也用于支持操作的参数,并保存操作的结果。例如,iadd指令将两个整数相加。相加的两个整数应该是操作数栈顶的两个字。这两个字是由先前的指令压进堆栈的。这两个整数将从堆栈弹出、相加,并把结果压回到操作数栈中。 每个原始数据类型都有专门的指令对它们进行必须的操作。每个操作数在栈中需要一个存储位置,除了long和double型,它们需要两个位置。操作数只能被适用于其类型的操作符所操作。例如,压入两个int类型的数,如果把它们当作是一个long类型的数则是非法的。在Sun的虚拟机实现中,这个限制由字节码验证器强制实行。但是,有少数操作(操作符dupe和swap),用于对运行时数据区进行操作时是不考虑类型的。 4.无用单元收集堆 Java的堆是一个运行时数据区,类的实例(对象)从中分配空间。Java语言具有无用单元收集能力:它不给程序员显式释放对象的能力。Java不规定具体使用的无用单元收集算法,可以根据系统的需求使用各种各样的算法。 5.方法区 方法区与传统语言中的编译后代码或是Unix进程中的正文段类似。它保存方法代码(编译后的java代码)和符号表。在当前的Java实现中,方法代码不包括在无用单元收集堆中,但计划在将来的版本中实现。每个类文件包含了一个Java类或一个Java界面的编译后的代码。可以说类文件是Java语言的执行代码文件。为了保证类文件的平台无关性,Java虚拟机规范中对类文件的格式也作了详细的说明。其具体细节请参考Sun公司的Java虚拟机规范。
学java用什么电脑配置。
学java用什么电脑配置。 是个电脑就行,java对电脑配置要求不高 画cad用什么电脑配置 AutoCAD 32位版配置要求: 英特尔奔腾 4或AMD Athlon双核处理器(1.6 GHz或更高主频) 2 GB记忆体 1 GB可用磁碟空间(用于安装) 1,024 x 768 VGA真彩色显示器 AutoCAD 64位版配置要求: AMD Athlon 64 位处理器、支援SSE2技术的AMD Opteron处理器、支援SSE2技术和英特尔EM64T的英特尔至强处理器,或支援SSE2技术和英特尔EM64T的英特尔奔腾4处理器 2 GB记忆体 1.5 GB可用磁碟空间(用于安装) 1,024 x 768 VGA真彩色显示器 3D建模的其它要求(适用于所有配置) 英特尔奔腾4处理器或AMD Athlon处理器(3 GHz或更高主频);英特尔或AMD双核处理器(2 GHz或更高主频) 2GB或更大记忆体 2 GB硬碟空间,外加用于安装的可用磁碟空间 1,280 x 1,024 32位彩色视讯显示介面卡(真彩色),工作站级显示卡(具有128 MB或更大记忆体、支援Microsoft Direct3D) 画图 用什么电脑配置 画图、制图用的话配置引数上不能太差,电脑配置需求参考如下: 1.作业系统:windows 7(建议使用64位) 2.记忆体:最少 2GB(推荐 4GB及以上) 3.显示卡:视讯记忆体 1G 及以上 位宽 256 bit及以上 ,视讯记忆体型别 为DDR3以上 ,建议使用NVIDIA品牌显示卡(推荐使用solidworks认证的专业显示卡:如:NVIDIA Quadro 系列、ATI FireGL系列 或 Firepro系列) 4.CPU: intel 双核高主频64bit,建议使用i5系列或i7系列,建议cpu主频高于2.8GHz ,中央处理器必须支援 SSE2 (Streaming SIMD Extensions 2) 5.硬碟:不低于7200转 6.软体: office 2007或2010 7.显示器:解析度不低于1400X900。 这些软体都要安装吗 ? 这些软体 平时 工作 都要同时开启执行吗? 不要太重 光碟机烧录机 硬碟用固态 那就选超薄本 价格有什么要求吗 学会计用什么电脑配置 会计对电脑的要求配置不是很高,只要能满足基本的软体执行就可以了 会计电算化用的软体对电脑的配置要求不是很高,目前市场上3000+的电脑都能够流畅执行。 玩CSgo要用什么电脑配置 游戏的执行和机器的CPU,记忆体,独立显示核心等硬体配置有直接的关系,另外也和系统,驱动,其他软体等也有联络。当前,是否可以玩一个游戏,首先需要检视游戏执行的配置要求和机器的配置要求做一个对比,检视机器的配置是否符合。如果可以满足游戏的最低执行需求,则可以支援。" 挖leo币要用什么电脑配置 CPU Intel 酷睿i7 3970X 1 ¥ 7599 ¥7599 主机板 微星Big Bang XPower II 1 ¥ 3999 ¥3999 记忆体 海盗船16GB DDR3 2400套装(CMD16GX3M4A2400C9) 2 ¥ 2899 ¥3699 固态硬碟 金胜维PCI-E 储存卡(MC2S81M2T) 1 ¥ 75000 3万 1家商家 显示卡 华硕ARES2-6GD5 4 ¥ 14888 停产 机箱 NZXT Phantom 幻影(USB3.0版) 1 ¥ 979 ¥599 电源 安耐美白金冰核 1500W(EPM1500EGT) 1 ¥ 2590 ¥2699 散热器 Tt BigWater770(CL-W0187) 1 ¥ 1450 ¥1350 显示器 LG 29EA93 1 ¥ 4588 ¥3999 滑鼠 Mad Catz M.O.U.S.9磨砂黑蓝芽4.0无线滑鼠 1 ¥ 1299 ¥1129 键盘 伊赛斯龙盾Main Tank机械键盘 1 ¥ 1399 ¥1399 音箱 惠威M3 1 ¥ 7800 ¥7800 网络卡 Intel E10G42BFSR 1 ¥ 7800 ¥7500 特效要用什么电脑配置 配置如下: 2.2GHz 四核 Intel Core i7 处理器 Turbo Boost 高达 3.4GHz 16GB 1600MHz 记忆体 基于 PCIe 的 256GB 快闪记忆体 Intel Iris Pro Graphics 图形处理器 做股票用什么电脑配置 做股票不需要高配置,一般配置就可以了,如果是笔记本CPUi3-i5都可以,记忆体条最少8G,这些就够了。 美工做图用什么电脑配置 美工要做动画吗? 要的话配置高点 如果只是一些平面软体3000块搞定
什么是Java虚拟机?
虚拟机是一种抽象化的计算机,通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机有自己完善的硬体架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。JVM屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。这种解释应该算是正确的,但是只描述了虚拟机的外部行为和功能,并没有针对内部原理做出说明。一般情况下我们不需要知道虚拟机的运行原理,只要专注写java代码就可以了,这也正是虚拟机之所以存在的原因--屏蔽底层操作系统平台的不同并且减少基于原生语言开发的复杂性,使java这门语言能够跨各种平台(只要虚拟机厂商在特定平台上实现了虚拟机),并且简单易用。这些都是虚拟机的外部特性,但是从这些信息来解释虚拟机,未免太笼统了,无法让我们知道内部原理。从进程的角度解释JVM让我们尝试从操作系统的层面来理解虚拟机。我们知道,虚拟机是运行在操作系统之中的,那么什么东西才能在操作系统中运行呢?当然是进程,因为进程是操作系统中的执行单位。可以这样理解,当它在运行的时候,它就是一个操作系统中的进程实例,当它没有在运行时(作为可执行文件存放于文件系统中),可以把它叫做程序。对命令行比较熟悉的同学,都知道其实一个命令对应一个可执行的二进制文件,当敲下这个命令并且回车后,就会创建一个进程,加载对应的可执行文件到进程的地址空间中,并且执行其中的指令。下面对比C语言和Java语言的HelloWorld程序来说明问题。首先编写C语言版的HelloWorld程序。编译C语言版的HelloWorld程序:gcc HelloWorld.c -o HelloWorld运行C语言版的HelloWorld程序:zhangjg@linux:/deve/workspace/HelloWorld/src$ ./HelloWorld hello worldgcc编译器编译后的文件直接就是可被操作系统识别的二进制可执行文件,当我们在命令行中敲下 ./HelloWorld这条命令的时候, 直接创建一个进程, 并且将可执行文件加载到进程的地址空间中, 执行文件中的指令。作为对比, 我们看一下Java版HelloWord程序的编译和执行形式。首先编写源文件HelloWord.java :编译Java版的HelloWorld程序:运行Java版的HelloWorld程序:zhangjg@linux:/deve/workspace/HelloJava/src$ java -classpath . HelloWorld HelloWorld从上面的过程可以看到, 我们在运行Java版的HelloWorld程序的时候, 敲入的命令并不是 ./HelloWorld.class 。 因为class文件并不是可以直接被操作系统识别的二进制可执行文件 。 我们敲入的是java这个命令。 这个命令说明, 我们首先启动的是一个叫做java的程序, 这个java程序在运行起来之后就是一个JVM进程实例。上面的命令执行流程是这样的:java命令首先启动虚拟机进程,虚拟机进程成功启动后,读取参数“HelloWorld”,把他作为初始类加载到内存,对这个类进行初始化和动态链接(关于类的初始化和动态链接会在后面的博客中介绍),然后从这个类的main方法开始执行。也就是说我们的.class文件不是直接被系统加载后直接在cpu上执行的,而是被一个叫做虚拟机的进程托管的。首先必须虚拟机进程启动就绪,然后由虚拟机中的类加载器加载必要的class文件,包括jdk中的基础类(如String和Object等),然后由虚拟机进程解释class字节码指令,把这些字节码指令翻译成本机cpu能够识别的指令,才能在cpu上运行。从这个层面上来看,在执行一个所谓的java程序的时候,真真正正在执行的是一个叫做Java虚拟机的进程,而不是我们写的一个个的class文件。这个叫做虚拟机的进程处理一些底层的操作,比如内存的分配和释放等等。我们编写的class文件只是虚拟机进程执行时需要的“原料”。这些“原料”在运行时被加载到虚拟机中,被虚拟机解释执行,以控制虚拟机实现我们java代码中所定义的一些相对高层的操作,比如创建一个文件等,可以将class文件中的信息看做对虚拟机的控制信息,也就是一种虚拟指令。编程语言也有自己的原理, 学习一门语言, 主要是把它的原理搞明白。 看似一个简单的HelloWorld程序, 也有很多深入的内容值得剖析。JVM体系结构简介为了展示虚拟机进程和class文件的关系,特意画了下面一张图:根据上图表达的内容,我们编译之后的class文件是作为Java虚拟机的原料被输入到Java虚拟机的内部的,那么具体由谁来做这一部分工作呢?其实在Java虚拟机内部,有一个叫做类加载器的子系统,这个子系统用来在运行时根据需要加载类。注意上面一句话中的“根据需要”四个字。在Java虚拟机执行过程中,只有他需要一个类的时候,才会调用类加载器来加载这个类,并不会在开始运行时加载所有的类。就像一个人,只有饿的时候才去吃饭,而不是一次把一年的饭都吃到肚子里。一般来说,虚拟机加载类的时机,在第一次使用一个新的类的时候。本专栏后面的文章会具体讨论Java中的类加载器。由虚拟机加载的类,被加载到Java虚拟机内存中之后,虚拟机会读取并执行它里面存在的字节码指令。虚拟机中执行字节码指令的部分叫做执行引擎。就像一个人,不是把饭吃下去就完事了,还要进行消化,执行引擎就相当于人的肠胃系统。在执行的过程中还会把各个class文件动态的连接起来。关于执行引擎的具体行为和动态链接相关的内容也会在本专栏后续的文章中进行讨论。我们知道,Java虚拟机会进行自动内存管理。具体说来就是自动释放没有用的对象,而不需要程序员编写代码来释放分配的内存。这部分工作由垃圾收集子系统负责。从上面的论述可以知道, 一个Java虚拟机实例在运行过程中有三个子系统来保障它的正常运行,分别是类加载器子系统, 执行引擎子系统和垃圾收集子系统。 如下图所示:虚拟机的运行,必须加载class文件,并且执行class文件中的字节码指令。它做这么多事情,必须需要自己的空间。就像人吃下去的东西首先要放在胃中。虚拟机也需要空间来存放个中数据。首先,加载的字节码,需要一个单独的内存空间来存放;一个线程的执行,也需要内存空间来维护方法的调用关系,存放方法中的数据和中间计算结果;在执行的过程中,无法避免的要创建对象,创建的对象需要一个专门的内存空间来存放。关于虚拟机运行时数据区的内容,也会出现在本专栏后续的文章中。虚拟机的运行时内存区大概可以分成下图所示的几个部分。(这里只是大概划分,并没有划分的很精细)总结写到这里,基本上关于我对java虚拟机的理解就写完了。这篇文章的主题虽然是深入理解Java虚拟机,但是你可能感觉一点也不“深入”,也只是泛泛而谈。我也有这样的感觉。限于自己水平有限,也只能这样了,要是想深入理解java虚拟机,强烈建议读一下三本书:《深入Java虚拟机》《深入理解Java虚拟机JVM高级特性与最佳实践》《Java虚拟机规范》其实我也读过这几本书,但是它们对虚拟机的解释也是基于一个外部模型,而没有深入剖析虚拟机内部的实现原理。虚拟机是一个大而复杂的东西,实现虚拟机的人都是大牛级别的,如果不是参与过虚拟机的实现,应该很少有人能把它参透。本专栏后面的一些文章也参考了这三本书, 虽然讲解Java语法的书不计其数, 但是深入讲解虚拟机的书, 目前为止我就见过这三本,并且网上的资料也不是很多。最后做一个总结:1 虚拟机并不神秘,在操作系统的角度看来,它只是一个普通进程。2 这个叫做虚拟机的进程比较特殊,它能够加载我们编写的class文件。如果把JVM比作一个人,那么class文件就是我们吃的食物。3 加载class文件的是一个叫做类加载器的子系统。就好比我们的嘴巴,把食物吃到肚子里。4 虚拟机中的执行引擎用来执行class文件中的字节码指令。就好比我们的肠胃,对吃进去的食物进行消化。5 虚拟机在执行过程中,要分配内存创建对象。当这些对象过时无用了,必须要自动清理这些无用的对象。清理对象回收内存的任务由垃圾收集器负责。就好比人吃进去的食物,在消化之后,必须把废物排出体外,腾出空间可以在下次饿的时候吃饭并消化食物。扩展资料:关于JAVA虚拟机的参数说明如下:1、运行class文件执行带main方法的class文件,Java虚拟机[3] 命令参数行为:java 注意:CLASS文件名不要带文件后缀.class例如:java Test如果执行的class文件是带包的,即在类文件中使用了:package 那应该在包的基路径下执行,Java虚拟机命令行参数:java .CLASS文件名例如:PackageTest.java中,其包名为:com.ee2ee.test,对应的语句为:package com.ee2ee.test;PackageTest.java及编译后的class文件PackageTest.class的存放目录如下:classes|__com|__ee2ee|__test|__PackageTest.java|__PackageTest.class要运行PackageTest.class,应在classes目录下执行:java com.ee2ee.test.PackageTest2、运行jar文件中的class原理和运行class文件一样,只需加上参数-cp ;即可。例如:执行test.jar中的类com.ee2ee.test.PackageTest,命令行如下:java -cp test.jar com.ee2ee.test.PackageTest3、显示JDK版本信息当一台机器上有多个jdk版本时,需要知道当前使用的是那个版本的jdk,使用参数-version即可知道其版本,命令行为:java -version4、增加虚拟机可以使用的最大内存Java虚拟机可使用的最大内存是有限制的,缺省值通常为64MB或128MB。如果一个应用程序为了提高性能而把数据加载内存中而占用较大的内存,比如超过了默认的最大值128MB,需要加大java虚拟机可使用的最大内存,否则会出现Out of Memory的异常。启动java时,需要使用如下两个参数:-Xms java虚拟机初始化时使用的内存大小-Xmx java虚拟机可以使用的最大内存以上两个命令行参数中设置的size,可以带单位,例如:256m表示256MB举例说明:java -Xms128m -Xmx256m ...表示Java虚拟机初始化时使用的内存为128MB,可使用的最大内存为256MB。对于tomcat,可以修改其脚本catalina. sh(Unix平台)或catalina.bat(Windows平台),设置变量JAVA_OPTS即可,例如:JAVA_OPTS='-Xms128m -Xmx256m'参考资料:百度百科-java虚拟机
如何选择java虚拟主机
但选择虚拟主机是一件让人头痛的事情,在这里分享一下我购买虚拟主机的一些经验,希望可以让计划购买java虚拟主机的朋友少走一些弯路。 在购买虚拟主机之前其实我心中有三个方案: 第一个方案:购买服务器或者租用服务器 第二个方案:普通PC+花生壳 第三个方案:购买虚拟主机 毫无疑问,第一个方案对于个人建站来说,成本较高,可以待网站有一定的流量和知名度,或者有一定的收入后再作考虑;如果已有PC,则第二方案是一个不错的既可以节约成本又可以解决问题的方案,但由于本人只有一台手提,平常工作要用,如果只是为了部署这一个网站而花几K去买PC,感觉成本也高了,所以放弃了;最后决定采用第三个方案,也就是购买虚拟主机。但问题随之而来,到底要怎么选择虚拟主机呢?哪一个虚拟主机供应商有优势呢?是否支持网站用到的框架和技术的呢?性能又如何呢?售后服务呢?本人在选择虚拟主机的标准是下面的几点: 第一:完全兼容支持我网站用到的框架和技术。这一点很重要,因为之前曾有朋友购买过jsp虚拟主机,结果把网站上传后根本不起作用,原来网站用到的一些技术虚拟主机不支持。 第二:可以免费试用一段时间。需要确保网站上传后能正常访问,也就是说需要验证一下第一点。 第三:性价比高。就是满足基本要求后,价格不能高。 第四:管理功能齐全,操作友好方便。包括tomcat可单独管理、数据库可单独管理,其他如压缩/解压等。 第五:稳定。不要三五天就出现访问不了,或者数据丢失,又或者文件丢失等现象。 第六:售后服务好。这一点也是非常重要的,售后服务质量可以反映一间公司的生命力,可以决定其能走多远。 本人的选择过程如下: 首先,通过搜索引擎搜索虚拟主机供应商进行对比,以便筛选。选好供应商后找一些虚拟主机评测网浏览一下选中的虚拟主机的评价,虽然评价不一定是真的,但在你毫不知情的情况下还是有一定的作用的,至于该信多少,则需要运用你自己的智慧去分析和判断。 然后对比一下各项指标,例如操作系统、web空间大小、月流量大小、可绑定域名数量、是否能自助重启tomcat等,当然还有价格。另外还有一点很重要的就是要查看服务提供商经营了多长时间了,年份越多则说明实力越强,技术越成熟,经得起考验。 接着下来是看其是否提供免费试用,因为提供免费试用可以验证其是否支持开发网站时用的框架和技术,如果买下了却不支持开发的网站,那所有的付出就是竹篮打水一场空,还令到自己十分不开心,赔了夫人又折兵。 经过一番的捉对厮杀后,本人最后选择了西部数码,因为在提供免费试用的虚拟主机服务商中,它是最优的。选定目标后,本人开始发起进攻,当然是马上开始试用。因为它只有七天的试用期,结果我试用一次后,又进行了第二次和第三次的试用,本人是按我设定的标准进行试用的,而且特别留意的是它的服务。经过几次的试用,我觉它的除了满足我想要的功能外,服务特别好,让我觉得很贴心,除提供在线服务,还有免费咨询电话。有一次我程序上传后出问题了,查询不到数据,我以为我数据库的数据被莫名其妙删除了,于是有点烦躁,和售后服务人员说话时语气有点重,但他们还是十分耐心地帮我查因,结果后来我查了一下表,原来数据在,我承认了错误,他们也很有礼貌说没关系。于是我终于下定决心付款购买了虚拟主机。
什么是java虚拟主机
所谓虚拟主机,也叫“网站空间”就是把一台运行在互联网上的服务器划分成多个“虚拟”的服务器,每一个虚拟主机都具有独立的域名和完整的Internet服务器(支持WWW、FTP、E-mail等)功能。一台服务器上的不同虚拟主机是各自独立的,并由用户自行管理。但一台服务器主机只能够支持一定数量的虚拟主机,当超过这个数量时,用户将会感到性能急剧下降。
JAVA虚拟主机是虚拟主机的一种,是用于建立Web网站的一种服务形式,支持常用的JAVA技术,JAVA虚拟主机是运行JAVA程序的一个环境。JAVA虚拟主机是JAVA Hosting,JAVA虚拟机是JVM。
西部数码的java虚拟主机空间怎么样,java主机选择哪个机房比较好,怎样才能优惠
西部数码Java虚拟主机采用CentOs5.1/APACHE2.0/ TOMCAT6架构,有如下特点:
1.独享jvm和tomcat服务,并可自主重新启动,互不影响,更安全稳定 .
2.提供tomcat访问日志
3.支持部署多个应用程序,赠送Mysql5.0数据库。
4.支持tomcat自带的应用程序管理程序,tomcat5.5.27/tomcat6.0.18,jdk 1.6.0_12,mod_jk 1.2.27
5.支持Servlet2.4,jsp2.0,Struts1,Struts2,Spring,Hibernate,proxool,javamail 机房,有2个可以选择。
一个是西部数码双线机房,一个是郑州双线机房,都不错的机房,根据自己的情况,并且,如果选择了郑州双线机房,觉得不够用,可以免费跟换为其他的机房。所以机房选择,还是蛮自由的。java虚拟主机,都是比较贵的。用的人少,毕竟比一般的空间贵了很多。贵也有贵的好处,贵了就用的人少,这个服务器上的网站同样也比较少,这样,就可以享受更多的服务器资源。所以,java主机,一般都是非常高效的,速度非常不错。在哪里买比较优惠呢。
在西部数码总站买,确实很贵,但,西部数码有很多代理商,代理商都是8折,相比,非常实惠,产品是一样的,没有必要去西部数码总站买,找个比较可靠的代理商就可以了,之前,我在其中的一个代理买的,忘记这个代理叫什么名字了,这个代理几乎是每天都是12个小时售前都是在线的,24小时售后,还是支付宝特约商家,重装电脑了,收藏丢失了,忘记名字了,现在用的另外一个代理的,也是非常优秀的西部数码代理,跟之前我用的一样,支付宝特约商家。希望对你有用,搜索一下西部数码代理,第一个就是思朴互联,名字比较好记。或者搜索一下 思朴互联。
网络编程方面的,最好是java的
给软件开发初学者
在论坛上呆久了,发现很大一部分有关开发的帖子都是有关心怀梦想,立志成为一个软件英雄或者响当当的黑客人物;或者是狂热的游戏玩家,突然想迈入游戏开发的殿堂,自己打造一个完美的游戏;或者被以前IT行业的“钱”途无量所吸引,为了经济因素希望成为一个程序员的,而寻求进入软件开发领域之门的求助帖子。
这些诸如“你好,我想做程序员,应该怎么做?”,“初学C++,请问看什么书好”,“请高手帮我看看这个程序”,“我想转行,请高手指点”……的帖子占了各大软件开发论坛帖子总量的很大一部分,而且内容是长年不变,重复来重复去 :P
自从做了epubcn的C++板块的版主,经常收到不相识网友的消息或Email,基本上还是问这些问题。看到这些帖子和Email,不禁想起自己刚刚迈入软件开发的领域,茫茫然不知何去何从,兴奋而又彷徨不安的过去,这样的经历一次又一次,在不同的地点、不同的时间仍然在不断的重复。今天终于坐下来,写下一点文字,希望能够对彷徨的朋友们有点帮助。
确认你真的要迈入软件开发领域
软件开发是一项纯智力活动(现在人们都意识到长时间超负荷的连续写程序并不会提高软件生产率,反而会对软件品质造成很大负面影响,所以尽管很多程序员仍然长时间加班,但这种现象正在逐步减少并最终会消失,所以体力要求并不会比其他行业高),如果你不是一个智力高于平均水平的人,说实话,软件开发并不适合你,你基本不可能在软件开发领域取得很高的成就和地位,而且不久就会因为年龄的增长而被淘汰。
如果你以那些开发出共享软件的软件英雄和著名黑客为榜样,立志也要成为他们的一员,像武侠小说中的大侠一样仗剑江湖。我要先给你泼上大大一盆冷水,把你从幻想拉到现实中来。首先,现在的软件其复杂度和规模都远远超过以前,想一个人独力完成一个规模稍大的软件,基本没有可能(虽然还是有些特例, but trust me,那些仅仅是特例,请不要把自己想像成独一无二的超人、幸运儿);其次,无论是软件英雄还是仗剑江湖的顶尖黑客,他们的软件开发功底和智力都远远超过软件行业从业者的平均水平,没有多年的积累和坚韧超常人的毅力,是不可能,换句话说,想成为他们的一员,可以,但请首先成为一个合格的软件开发人员。
如果你是因为传说中程序员的所谓“高薪”,对自己现在从事的工作不满意,而萌生转行的念头,我劝你还是再慎重考虑一下。程序员的待遇一般来说,是要比平均水平高一些,但远远谈不上高薪,而且以现在程序员的工作量来算,其实同样的付出,程序员所得到的能和平均水平看齐就不错了,程序员的竞争和淘汰也是异常残酷的。技术的更新速度更是其他行业所罕见,每个程序员都要不停的跑步跟上,不使自己落伍,所以在这个层面上来说,没有谁可以停下来休息,唯一能够积累下来的就是你的经验,但经验中能够为你的竞争力增添筹码的并不多。
说了这么多,并不是我故意贬低,而是希望告诉你我所知道的软件开发行业的真实情况,基于此请再慎重考虑你是不是真的要迈入软件开发领域。
检验一下你是否适合当个程序员
在我看来,要做一个合格的程序员,你需要具备下面几个条件:
1. 强烈的好奇心和求知欲
2. 追求完美的精神
3. 良好的逻辑分析能力
其他方面的条件几乎所有类似的帖子都有提及:如果你不是准备单打独斗,那么团队合作能力必不可少;英语我就懒得说了,没有基本的阅读英文资料的能力,我劝你还是打消做个程序员的想法,没有为什么;数学能力也是必不可少的,如果不是做算法,高中水平的数学能力就足够了,但一定要成绩很好才行。
那么为什么我要强调上面列的三点呢?
具有强烈的好奇心和求知欲,能够让你跟上技术发展的步伐,仅仅靠危机感和责任感,你对技术的学习会有很强的功利性质,导致你的技术体系不能构成一个完整自包容的整体,而且很难对技术有高层次的认识和掌握。
我认识的一个资深系统设计师跟我说过:做软件,“做出来”和“做的好”完全是两个概念,所要求的投入和技术水平是天壤之别。现在国内很多程序员仅仅把软件开发当作养家糊口的谋生手段,国内计划经济时代凑合、马马虎虎干活的思想也渗透到了软件业,很多程序员仅仅是把功能做出来,根本不会去考虑提高重用性、可维护性,也不会去考虑提高稳定性、运行速度,甚至连代码也是乱七八糟,基本的编码规范都不遵守(在我看来,这样的人不配“程序员”这个称号),在我们大声谴责国内软件业环境不好,拉项目靠关系,没有质量保证体系,老板不重视程序员,疯狂剥削程序员的时候,我们是不是该问问自己,你是不是只把眼睛盯着别人?
现在各种软件开发包应有尽有,包罗万象,编程工具也异常强大方便,对于国内占主流的MIS系统来说,要完成一个功能实在不是很难的事情,但是如果把系统做为一个整体,则大多数都是运行缓慢、占用资源过大、兼容性差、可维护性差、不稳定的系统,你可曾尝试过开发一个优秀的系统,如果有,你就会发现开发优秀软件是多么困难,对技术的要求是多么高,而你在努力做到完美的过程中水平的提升是多么快。没有追求完美的精神,无论外部环境如何好,你也是不会开发出优秀软件的,等待你的是无休止的修改和维护~,你的技术水平也永远停留在简单的编码阶段,最终只有被迫转行。
好了,我真的适合当个程序员,那我该如何开始?
首先选择一门编程语言和操作系统平台。
操作系统平台国内比较流行的基本有Windows、Linux(Unix)、Mac OS。一般来说大家都选择的是Windows平台,因为此平台是国内处于垄断地位的操作系统,而且有很多优秀的开发工具可供选择,缺点就是Windows 平台的开放性不高,往底层探究比较困难(但我对于言必称底层的观点比较反感,不是所有搞开发的都要对底层非常了解,做出用户满意的系统才是我们追求的根本,玩些底层的trick只是一种自我满足罢了。当然我们需要有一些掌握底层技术的高手,但这个是个人选择的问题),而且用惯Windows的程序员在配置、脚本等方面比较弱。Linux是开源平台,当然从理论上你可以操纵Linux的一切,但是有几个人能够达到这一水平?刚刚开始学习开发的程序员,在 Linux上也仅仅能够开发一些应用软件罢了。Linux下的开发工具不够人性化,但这种情况正在逐步得到缓解,Eclipse就是非常出色的开发平台。在Linux下开发,你可以得到大量优秀的源代码,并且一切都是透明的(只要你想),但你必须学习很多命令行指令,掌握各种系统和参数配置以及脚本方面的知识。
编程语言的选择更是令人头痛,我涉猎不多,对于有些语言,我无法给出任何建议,只好等这方面的高手来给大家补充了。我仅仅对C++和Java进行一些说明,当然这个也仅仅是基于个人体会,绝对不是权威观点 :P
C++仍然是目前占主流的开发语言(详细的可以阅读TCPL中的相关论述),而且一种语言的发展或消亡都是一个渐进的过程,在可以预见的将来,C ++仍然是一门举足轻重的开发语言,但其所针对的领域和方向可能会有所调整,我认为最主要的变化是C++会逐步从商业MIS系统市场上退出。选择C++的理由是关于C++的优秀开发书籍和开发工具最多,相关的资源也异常丰富,待对于一般应用程序的开发掌握之后,无需过渡,就可以深入学习各种技术,因为现阶段讲述系统底层奥秘和高级技术的书籍,基本都是选用C\C++做为示例语言。加上微软精心打造的开发平台Visual Studio或Borland的C++ Builder系列,学习起来更是如虎添翼。但C++现在的缺点也是比较明显的,我最深的感触就是对于XP和Agile Development的支持不好。
Java简化了C++的语法,学习起来比较容易(但随着Java的日益普及和发展,是否能够继续保持这一优势,我不敢断言),Eclipse 是非常优秀的Java开发平台,支持XP的整个过程:设计、测试、编码、重构……现阶段敏捷软件开发的主要语言就是Java。而且Java的跨平台特性更是非常大的优势。
实际上,选择哪门语言都没有关系,根据你的发展规划和目前身边的环境选择就可以,没有必要跟风,其后的坚持才是难点。
好,假设你选择了C++做为开发语言,在Windows平台上开发,那么我给你如下的学习建议(其他的选择请各位积极补充……):
C++语言的学习当然是基础,这个阶段由于没有任何在特定平台上的开发经验,我们只能按照书中的例子一个一个输入运行,暂时告别熟悉的图形界面,回到古老的DOS了。参考书的选择是这个阶段很多朋友关心的,Stan Lippman的《Essential C++》和《C++ Primer》是我优先推荐的,而《Essential C++》因为篇幅较小,讲解内容适当,而且对C++ STL的运用有不少描述,显得相当实用,我认为最适合初学者使用。无论选择了那本书做为入门教材,都应该逐个例子逐个例子的消化,不要贪快,但同时要对重点内容有所侧重。我们学习任何东西都是为了解决实际问题,所以请把重点放在我们实际中最常用的部分,而不要过多的追究一些细节和艰深晦涩的不常用技术。
此刻我们会碰到很多过后看来非常简单幼稚的问题,比如为什么编译出错,为什么按照书中的例子输进去却无法通过编译,找不到头文件等等,大体上这是因为刚刚接触程序开发,对程序理解还很初级,以及对于所使用的开发环境不够了解,特定编译器对标准C++的支持程度不一导致。请多阅读关于所使用开发环境的各种文档,以及查阅帮助文档。以我最经常使用的Visual C++配合MSDN来说,当出现一个我不能理解的编译错误时,按F4键编辑器就会自动跳到当前错误地点,下面的输出窗口也会给出错误代码(比如C××× ×),把错误代码记下,打开MSDN,在索引一栏输入错误代码,就能够查到详细的关于此错误的说明,当然,是英文的(不要问你不会英文怎么办,这是基本要求)。现在的开发工具查错排错非常方便。当然,有时很多错误原因并不是编译器所提示的地方,而是往前或往后一些地方,长期的编程经验可以提高查错速度。此时也请多练习练习Debug技术。
此阶段只要能够掌握C++的基本语言要素,对结构化程序设计和基于对象的设计有一定理解,能够完成一些简单的小程序就可以结束了,毕竟DOS 程序现在很难勾起我们学习的欲望了 :P 在此之后可以视自己的情况决定是否学习数据结构,数据结构是程序员的必修课,不可或缺,地位非常重要,即使你现在希望马上进入图形界面程序开发的世界,这一课我也提醒你记着早点补上。
终于可以迈入图形世界,我们要从SDK编程开始,不要担心,这不会花费你太长时间,但却是对Windows程序运行机制进行深入了解的好时机,在此的努力都不会白费(trust me),此时的参考书没有什么好考虑的,基础的有Charles Petzold的《Windows程序设计》,进阶的有《Windows核心编程》。请从《Windows程序设计》开始,Charles Petzold的书通俗易懂,学习起来非常轻松,而且对你的语言要求不高,只要懂C就可以了。
此时容易碰到的问题大多与项目设置有关,如果使用Visual C++,请按Alt+F7调出项目设置对话框仔细检查,并阅读相关文档,熟悉各项配置的意义。
此阶段请重点掌握Windows SDK程序的编写方法,Windows程序的运行机制和Windows消息机制,和常用的Windows API。我们还可以更进一步:尝试用前一阶段学到的C++知识对过程化的SDK程序进行初步的改造,将我们敲入计算机的程序变得可重用,按照自己对基于对象思想和面向对象思想的理解来重新编写例子程序。
OK,现在你已经初步入门了,掌握了C++的基本用法,对面向对象有了一点模糊而自以为是的认识,也能够写出Windows程序了,虽然还有点简单,还有点丑陋,不过,总归是图形界面啊。开始有点感觉了,是吗? :P 别急着往前冲,停一停,将C++和Windows SDK的基础打牢,贪多嚼不烂吗。此时有很多经典书籍等待你去掌握,也有几乎无限的题材供你练习,请尽量多阅读接触下面的资源:
《C++ Primer》
《Windows核心编程》
《应用程序调试技术》
面向对象开发设计方面的书籍
MSDN的Platform SDK部分,Periodicals部分(包含了大量有价值C++、SDK方面的技术文章)
CodeProject里相关的源代码是很好的补充学习资料
现在继续往前走吧,利用SDK开发毕竟有时太过于费时费力,还是使用更高级的应用程序开发框架的好,主要的有MFC和VCL,关于这些框架谁好谁坏的争论我已经听烦了,一句话,能帮助我们完成任务就行,它们无非都是工具,你自己随便选择吧。不过选择好之后,你应该明白,对于你的工具,了解越深,越能发挥它的威力。如果你选择了MFC,我建议学习下面的书籍:
《深入浅出MFC》:关于此书毋庸多说,尽管有人不停的贬低,但它的地位是无可置疑的,而且也是对我最有帮助的书籍之一。
《MFC程序设计》
《Visual C++技术内幕》
然后就停止找书吧,网上开发站点的数不胜数的源代码就是最好的老师了……
学习过程中碰到问题我该怎么办?
我始终认为学习软件开发过程中遇到的问题只有自己尽最大的努力去解决,才能收到最大的成效,对于那些动不动就把问题发到网上指望高手帮你解决的做法我非常不赞同,因为这样你并不能从中学到多少。我建议的做法是,首先尝试自己独力解决问题,花几个小时解决一个问题,是很正常的,不要几分钟解决不了就放弃了;实在无法解决的时候,请尝试尽量减小涉及范围,将问题归结一下,初步形成自己的结论;然后利用搜索引擎或者开发论坛中的搜索功能来搜索是否有对于自己问题的解答;实在没有的时候,再发帖子求助。请了解一点:你遇到的问题都是别人遇到过的,网上肯定有现成的解决方法(因为你还没有到开发研究前所未有的问题的水平:P),只看你找不找得到了,请尽力去利用现有的资源而不是麻烦别人。
CSDN的论坛、MSDN在线文档都是非常好的资源,基本上我们遇到的问题在这里都能找到解答。
(写的有点乱,大家凑合看吧B))
注:上面的内容还不够全面,非常欢迎各位充实。有什么不对之处,也欢迎大家指出讨论。
java链接SQL Server 时到主机的TCP/IP 连接失败是什么错误?
你和我前几天遇到的问题一摸一样
解决方案:
1 首先要做的是在sql新建查询里输入
exec sys.sp_readerrorlog 0, 1, 'listening'
运行后 会显示你的sql 正在运行的tcp/ip接口
看看是否和你java代码中指定的url中的接口不一致
2 你看一下服务器的TCP/IP是否被禁用了,sqlserver2005默认情况下是禁用了TCP/IP连接。启动TCP/IP连接的方法:开始\程序\Microsoft SQL Server 2005\配置工具\目录下的SQL Server Configuration Manager,选择mssqlserver协议, 然后右边窗口有个tcp/ip协议,然后启动它,把sqlserver服务停了再启动。
3
设置 “开始\程序\Microsoft SQL Server 2005\配置工具\SQL Server 外围应用配置器” 在“SQL Server 2005 外围应用配置器”页, 单击“服务和连接的外围应用配置器” ,然后单击展开“数据库引擎”, 选中“远程连接”,在右边选中“本地连接和远程连接”, 再选择要使用的协议,( 这个地方应当启用TCP/IP 和命名管道服务!)单击“应用”,您会看到下消息:
“直到重新启动数据库引擎服务后,对连接设置所做的更改才会生效。”单击“确定”按钮返回 。
4 或是防火墙的问题:你把1433的端口加到例外去就可以了。