一:实践一次这样的操作有助于理解Tomcat/Eclipse的启动原理,包括classpath的设置,option的配置等等;

二:通过Bash终端创建一个简单的Java项目(单项目单Module,如果是IDEA的多Module可以创建一个Proj,然后内部再创建Module,这时候Module就类似这里的Proj,但是编译和运行的pwd应该为Proj而非Module)

1.cd到工作空间,个人是:cd /home/silentdoer/TerminalProjs/JavaProjs;然后执行mkdir FirstTerminalProj创建第一个终端项目;

2.cd到FirstTerminalProj里,通过mkdir -p src/me/silentdoer/terminalprojtest classes同时创建src和classes目录,并创建src的包路径,然后通过touch src/me/silentdoer/terminalprojtest/Entrance.java创建一个java文件(后缀其实可以任意或不要);

3.vim ./me/silentdoer/terminalprojtest/Entrance.java;开始写简单代码;

4.第一步先写package me.silentdoer.terminalprojtest;之后便是写Entrance类和main方法;

5.把Entrance.java写好后保存退出,此时pwd在FirstTerminalProj目录里;

6.用javac src/me/silentdoer/terminalprojtest/Entrance.java -d classes命令将该文件编译到对应的目标目录,javac会自动在目标目录内创建与该类包路径对应的目录路径然后生成 类名.class文件;

7.用java -cp classes me.silentdoer.terminalprojtest.Entrance(这里可接参数列表)来运行me.silentdoer.terminalprojtest.Entrance类;注意这里是运行这个类,如果没有指定-cp则jvm会以CLASSPATH的为准去搜索这个类然后执行;

8.运行jar包的方法为java -jar xx.jar(接参数列表),注意这里是需要有.jar后缀的,因为jar包实际上还可以是zip包,它不像.class一样是固定的;

总结:

javac里的-classpath或-cp是用来指定java源文件中(不一定要.java结尾,就像shell脚本不一定要.sh一样,编译后自动是.class)引用的jar包或其它module的classes目录(即Module依赖另一个Module),否则javac发现引用的东西不存在会编译失败(这也是为什么看框架源码要将编译方式由javac换成eclipse的原因);

1.可通过-d xx/classes指定编译输出目录;注意javac可以编译任何路径下的源文件而不需要此文件在对应的目录结构下(已经经过测试确实是这样),但是运行.class则需要在对应的目录结构下(即包路径和目录路径一致,这是因为运行某个类实际上不是去运行而是告诉jvm我要运行哪个类,然后jvm去classpath里搜索)

2.可以javac ./src/me/silentdoer/terminaltestproj/Entrance.java -d ./classes来编译,最后自动生成完整的与包对应的目录和.class文件在classes中;

3.如果要一次性编译目录下所有的文件可以用:查了下也测试了似乎只能编译某个包下的所有文件用如me/silentdoer/test01/*.java实现;(最终想了下还是用shell脚本实现吧,就是传递两个参数,src路径和classes路径,然后shell遍历src下所有的目录通过cd $dir和cd ..实现转接到不同目录然后通过javac ./*.java -d classes来实现编译所有的.java文件[这时候后缀的好处体现出来了,虽然并不要求必须是.java],编译方式类似:javac src/me/silentdoer/terminalprojtest/*.java -d classes),这里不需要用到-sourcepath,目前不知道这个有什么用。

1)java运行字节码文件则要求提供-cp为classes目录,用java -cp ./classes me.silentdoer.terminalprojtest.Entrance即可运行;注意这里之所以不需要.class是因为javac是为了查找要编译的文件跟后缀无关,而所有的编译好的都叫XX.class,因此字节码文件后缀唯一而源文件后缀任意,所以运行时不需要附带.class;

2)如果运行的项目需要用到其它jar包或引用了其它module,则应该是java -cp ./classes:xx/other-module-classes:xx/XX.jar。。。这样子引用其它module和jar包;

3)java命令还可以指定JVM的其它参数,如java -cp ./classes-server -d64 -Dmypro=33 me.silentdoer.terminalprojtest.Entrance等等,这里-server表示jvm以server模式执行,-d64表示以64位数据模式执行[需要安装的是64位jre],-Dmypro=33表示在系统参数里添加key-value为mypro=33;

4)经常用来优化jvm和配置全局变量的参数:

1.-server,如tomcat启动时会指定;

2.-d64,只要安装的是64位的最好指定;

3.Dmypro=33,如tomcat启动时会指定DCATALINA_HOME=xxx等等

4.-Xms设定此jvm实例的初始的堆大小(内存)也是最小大小,使用方式为-Xms256m,即这个jvm在启动后就会从操作系统那申请256兆的内存;(单位包括k即kb,m即兆,g为G,应该没有byte单位的)

5.-Xmx设定此jvm实例最多可以从操作系统那里申请多少的内存,使用方式为-Xmx2048m,则当随着对应java app需要的内存越多此jvm实例会继续像操作系统申请内存,但不超过2048m;如果java app的需求超过了这个值就会报outofmemory异常;

6.-Xss设定jvm为对应java app每个启动线程分配的大小,jdk1.5以后是1M

这里java.lang.Runtime类中的 freeMemory(), totalMemory(), maxMemory()的输出和上面的配置有莫大关系,maxMemory获得此jvm实例设置的-Xmx大小,而totalMemory则是获得当前从操作系统中请求到的内存大小,freeMemory则是此jvm实例请求了多少内存但是没用上的;

如果没有配置-Xms则jvm实例是一点一点的从操作系统里申请内存的,即基本上用到多少申请多少,因而一定程序上影响jvm的性能,但是freeMemory会很小;而如果一开始就设置-Xms为一个较大的值,则对应java app一开始的freeMemory是会比较大的

,但是随着业务的进行freeMemory会波动,而且要用到内存可以立刻使用而不用等操作系统去分配;(输出的totalMemory会比jvm请求分配的略小,因为jvm自己也需要占用内存,这也是java程序比系统原生程序要慢的原因之一)

重要:这些参数都要在xxx.Entrance之前指定而不能放在后面,即java -cp ./ demo.Test -server -d64 -Xms1024m是错误的,要放在demo.Test的前面,至少我这里1.8测试是这样的;

以上的配置要符合条件,比如你只有4G内存却设置-Xms20480m显然是有问题的,也不能设置满,毕竟操作系统还要运行其它进程而且也未必给jvm实例这么多内存;

在终端上创建Java项目及编译和运行的更多相关文章

  1. github上创建java项目简单操作

    github上创建java项目简单操作 参考L: github上创建java项目简单操作 - CSDN博客http://blog.csdn.net/qq_29392425/article/detail ...

  2. 使用Maven创建Java项目

    在本教程中,我们将向你展示如何使用 Maven 来创建一个 Java 项目,导入其到Eclipse IDE,并打包 Java 项目到一个 JAR 文件. 所需要的工具: Maven 3.3.3 Ecl ...

  3. Maven学习(十)-----使用Maven创建Java项目

    所需要的工具: Maven 3.3.3 Eclipse 4.2 JDK 8 注意:请确保 Maven 是正确安装和配置(在Windows,*nix,Mac OSX系统中),然后再开始本教程,避免 mv ...

  4. maven 学习---使用Maven创建Java项目

    在本教程中,我们将向你展示如何使用 Maven 来创建一个 Java 项目,导入其到Eclipse IDE,并打包 Java 项目到一个 JAR 文件. 所需要的工具: Maven 3.3.3 Ecl ...

  5. Java开发环境的搭建以及使用eclipse从头一步步创建java项目

    一.java 开发环境的搭建 这里主要说的是在windows 环境下怎么配置环境. 1.首先安装JDK java的sdk简称JDK ,去其官方网站下载最近的JDK即可..http://www.orac ...

  6. java第一天--Java开发环境的搭建以及使用eclipse从头一步步创建java项目

    一.java 开发环境的搭建 这里主要说的是在windows 环境下怎么配置环境. 1.首先安装JDK java的sdk简称JDK ,去其官方网站下载最近的JDK即可..http://www.orac ...

  7. 搭建一套Java开发环境以及使用eclipse从头一步步创建java项目

    一.java 开发环境的搭建 在windows 环境下怎么配置环境. 1.首先安装JDK java的sdk简称JDK ,去其官方网站下载JDK. https://www.oracle.com/tech ...

  8. Linux巩固记录(2) java项目的编译和执行

    由于要近期使用hadoop等进行相关任务执行,操作linux时候就多了 以前只在linux上配置J2EE项目执行环境,无非配置下jdk,部署tomcat,再通过docker或者jenkins自动部署上 ...

  9. Eclipse 创建 Java 项目

    打开新建 Java 项目向导 通过新建 Java 项目向导可以很容易的创建 Java 项目.打开向导的途径有: 通过点击 "File" 菜单然后选择 New > Java P ...

随机推荐

  1. javaEncode

    1.MD5加密 md5多用于用户密码加密或者签名使用,因md5不可逆,可用于身份验证. MessageDigest md5=MessageDigest.getInstance("MD5&qu ...

  2. python 冷知识点

    # int could accept parameters in bool type.int(True) # result is 1 int(False) # result is 0 reprlib. ...

  3. 类定义,创建/销毁OC对象

    类定义 1 OC类分为2个文件,一个是.h文件,一个是.m文件: 2 .h文件存放类.函数声明: 3 .m文件类的具体实现: 4 类声明使用关键字@interface.@end来声明: 5 类实现使用 ...

  4. Haskell语言学习笔记(21)Array

    Ix 数组下标类型 Prelude> :m +Data.Array Prelude Data.Array> data Colour = Red | Orange | Yellow | Gr ...

  5. HTML CSS + DIV实现整体布局 part2

    9.盒模型的层次关系 我们通过一个经典的盒模型3D立体结构图来理解,如图:     从上往下看,层次关系如下: 第1层:盒子的边框(border),     第2层:元素的内容(content).内边 ...

  6. 类的"魔法"方法

    1. __init__()方法 <1>使用方式 def 类名: #初始化函数,用来完成一些默认的设定 def __init__(): pass 总结1 当创建Car对象后,在没有调用__i ...

  7. Python中文件编码的检测

    前言: 文件打开的原则是“ 以什么编码格式保存的,就以什么编码格式打开 ”,我们常见的文件一般是以“ utf-8 ”或“ GBK ”编码进行保存的,由于编辑器一般设置了默认的保存和打开方式,所以我们在 ...

  8. jquery clone 获取文本框值得问题

    1 clone 出来的文本框 默认不会把原来的事件也带过去 如果使用 $("#").clone(true);   true  可以将原来的事件带过去 获取文本框的值 可以使用事件 ...

  9. MySQL+Navicat for MySQL安装

    一.安装MySQL 1.下载MySQL http://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.10-winx64.zip 2.安装 2.1解压安装包 ...

  10. zoj1109-Language of FatMouse 【字典树】

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=109 Language of FatMouse Time Limit: 10 S ...