Java简要介绍
[TOC] Java: Sun, Green Project, Oak, James Gosling; 1995:Java 1.0, Write once, Run Anywhere; 1996:JDK(Java Development Kit),包含类库、开发工具(javac)、JVM(SUN Classic VM) JDK 1.0, Applet, AWT 1997:JDK 1.1 1998: JDK 1.2 Sun分拆Java技术为三个方向: J2SE:Standard Edition J2EE:Enterprise Edition J2ME:Mobile Edition 代表性技术:EJB,java plugin, Swing, JIT(Just In Time,即时编译) 2000:JDK 1.3 HotSpot VM 2002:JDK 1.4 2006:Sun开源了Java技术,GPL,建立一个称为OpenJDK组织; Java 2 SE, Java 2 EE, Java 2 ME 2011:JDK 1.7 2014:JDK 1.8 2016:JDK 1.9 Java代码的运行: *.java(source code) --> javac --> *.class(bytecode) jvm:class loader,加载程序的类文件,及程序的类文件依赖到的其它的类文件而后运行; 整个运行表现为一个jvm进程; threads; java技术体系: Java编程语言 Java Class文件格式 Java API Java VM class loader 执行引擎 JVM运行时区域: 方法区:线程共享; 用于存储被JVM加载的class信息、常量、静态变量、方法等; 堆:是jvm所管理的内存中占用空间最大的一部分;也是GC管理的主要区域;存储对象; Java栈:线程私有,存储 线程自己的局部变量; PC寄存器:线程私有的内存空间,程序的指令指针; 本地方法栈: 安装JDK 了解当前的java环境: ~]# java -version OpenJDK: java-VERSION-openjdk: The OpenJDK runtime environment. java-VERSION-openjdk-headless: The OpenJDK runtime environment without audio and video support. java-VERSION-openjdk-devel: The OpenJDK development tools. CentOS 7: VERSION:1.6.0, 1.7.0, 1.8.0 java-1.8.0-openjdk-devel 注意:多版本并存时,可使用 alternatives命令设定默认使用的版本; Oracle JDK: 安装相应版本的rpm包; jdk-VERSION-OS-ARCH.rpm 例如:jdk-1.8.0_25-linux-x64.rpm 注意:安装完成后,要配置JAVA_HOME环境变量,指向java的安装路径; OpenJDK: JAVA_HOME=/usr Oracle JDK: JAVA_HOME=/usr/java/jdk_VERSION Java 2 EE: CGI: Common Gateway Interface Servlet: 类库;web app; Servlet container, Servlet Engine JSP: Java Server Page <html> <title>TITLE</title> <body> <h1>...</h1> <% ... java code... %> </body> </html> .jsp -->jasper--> .java --> javac --> .class --> jvm 注意:基于jasper将静态输出的数据转为java代码进行输出; JSP Container: JSP + Servlet Container Java Web Server:JWS ASF:JServ Tomcat 3.x Tomcat 4.x Catalina http://tomcat.apache.org/ 商业实现: WebSphere, WebLogic, Oc4j, Glassfish, Geronimo, JOnAS, JBoss, ... 开源实现: Tomcat, Jetty, Resin, ... Tomcat: Java 2 EE技术体系的不完整实现; JVM常用的分析工具: jps:用来查看运行的所有jvm进程; jinfo:查看进程的运行环境参数,主要是jvm命令行参数; jstat:对jvm应用程序的资源和性能进行实时监控; jstack:查看所有线程的运行状态; jmap:查看jvm占用物理内存的状态; jconsole: jvisualvm: 官方文档:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/ jps:Java virutal machine Process Status tool, jps [-q] [-mlvV] [<hostid>] -q:静默模式; -v:显示传递给jvm的命令行参数; -m:输出传入main方法的参数; -l:输出main类或jar完全限定名称; -V:显示通过flag文件传递给jvm的参数; [<hostid>]:主机id,默认为localhost; jinfo:输出给定的java进程的所有配置信息; jinfo [option] <pid> -flags:to print VM flags -sysprops:to print Java system properties -flag <name>:to print the value of the named VM flag jstack:查看指定的java进程的线程栈的相关信息; jstack [-l] <pid> jstack -F [-m] [-l] <pid> -l:long listings,会显示额外的锁信息,因此,发生死锁时常用此选项; -m:混合模式,既输出java堆栈信息,也输出C/C++堆栈信息; -F:当使用“jstack -l PID"无响应,可以使用-F强制输出信息; jstat:输出指定的java进程的统计信息 jstat -help|-options jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]] # jstat -options -class:class loader -compiler:JIT -gc:gc -gccapacity:统计堆中各代的容量 -gccause: -gcmetacapacity -gcnew:新生代 -gcnewcapacity -gcold:老年代 -gcoldcapacity -gcutil -printcompilation [<interval> [<count>]] interval:时间间隔,单位是毫秒; count:显示的次数; -gc: S0C :S0 总大小 S1C :S1 总大小 S0U :S0 已用大小 S1U :S1 已用大小 EC :Eden区总大小 EU :Eden区已用大小 OC :老年代总大小 OU :老年代已用大小 MC :Metaspace 总大小 MU :Metaspace 已用大小 CCSC :CompressedClassSpace总大小 CCSU :CompressedClassSpace已用大小 YGC :Young GC 次数 YGCT :Young GC 消耗总时间 FGC :FullGC 次数 FGCT :FullGC 消耗总时间 GCT :GC总消耗时间 参考文档:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jstat.html jmap:Memory Map, 用于查看堆内存的使用状态; jhat:Java Heap Analysis Tool jmap [option] <pid> 查看堆空间的详细信息: jmap -heap <pid> 查看堆内存中的对象的数目: jmap -histo[:live] <pid> live:只统计活动对象; 保存堆内存数据至文件中,而后使用jvisualvm或jhat进行查看: jmap -dump:<dump-options> <pid> dump-options: live dump only live objects; if not specified, all objects in the heap are dumped. format=b binary format file=<file> dump heap to <file>