运维角度的Java知识点总结

JAVA是一个面向对象的编程语言,由SUN公司的程序员所开发、它不仅吸收了C++的各种优点,而且还撇弃了C++中难以理解的概念,如多继承、指针等;因此JAVA语言具有功能强大且简单易用两个特征,JAVA作为静态面向对象语言的代表,是全世界最受欢迎的计算机语言(没有之一)

Java包含四个独立却又彼此相关的技术

  1. JVM,Java的虚拟机,在JVM上运行Java的bytecode(字节码)
  2. Java的程序编程语言
  3. Java Class,Java的类文件格式;其决定Java程序编译出的字节码应该遵循那些规范等
  4. JAVA的应用程序接口(Java API);为了能让Java的应用程序得到更快更高效的开发,Java官方提供了Java API

Java展示的文件通常都是Java类的文件格式,而Java的源程序要转换成字节码才能在JVM上运行

一般Java的程序代码从写到运行要经过以下几个步骤:

  1. Java程序语言+Java API 由程序员开发出源程序如X.java
  2. X.java源程序经过编译器编译为Java的类文件如X.class(Java的类文件就是Java的字节码)
  3. 在JVM中,class loader(类加载器)加载X.class类文件,然后由解释器将X.calss文件由字节码格式解释成对应的OS平台二进制程序,这样Java程序就可以再JVM上运行了

注:.class文件就是字节码,但字节码不能直接运行,仍需在JVM中由解释器解释成对应的OS二进制程序,才能运行(机器只能理解二进制)

下图为Java代码从写到执行的过程

JVM进行解释的实现方式:

  1. 一次性解释器,解释字节码并执行,但第二次执行需要重新解释字节码
  2. 即时编译器,解释完的类(字节码)会缓存再内存中,让下次执行时直接使用,不用再次执行,但这样对所有解释产生的二进制程序都缓存会非常占用内存
  3. 自适应解释器,只将执行频率高的代码进行解释然后将解释后的二进制程序进行缓存,下次执行无需解释,一般只缓存20%的代码解释(认为这20%的代码完成了80%的操作)

下面是JAVA的执行过程

JVM(Java Virtual Machine)即Java虚拟机,是一种用于计算设备的规范,也是Java的核心和基础,是Java解释器和OS平台之间的虚拟处理器,它是一种基于下层的操作系统和硬件平台利用软件方法抽象出的计算机。可以在 上面执行Java的字节码程序,正是因为JVM的存在Java才实现了一次编译到处运行,可实现完全跨平台的运行

Java的编译器只需面向JVM,生成JVM能理解的字节码文件,然后由JVM将每一条指令翻译成为不同平台的机器代码(二进制程序),然后既可以在对应的平台执行

Java平台由Java虚拟机(Java Virtual Machine,简称JVM)和Java 应用编程接口(Application Programming Interface,简称API)构成。Java应用编程接口为此提供了一个独立于操作系统的标准接口,可分为基本部分和扩展部分。在硬件或操作系统平台上安装一个Java平台之后,Java应用程序就可运行。Java平台已经嵌入了几乎所有的操作系统。这样Java程序可以只编译一次,就可以在各种系统中运行。Java应用编程接口已经从1.1x版发展到1.2版。常用的Java平台基于Java1.5,最近版本为Java7.0。

JRE (Java running Environment)Java的运行环境:JRE可以让编译好的类(字节码)运行起来,是让Java运行起来的最小环境。简单来说JRE=JVM+API(不包括与开发有关的API)

JDK (Java Development Kit)是Java语言的软件开发工具包,是实现Java语言开发并让其运行的最小环境。简单来说JDK=Java语言+API+编译器+JVM

依据Java应用领域的不同,JDK有以下几种分类:

Java SE(J2SE),standard edition,标准版,是我们通常用的一个版本,从JDK 5.0开始,改名为Java SE。

Java EE(J2EE),enterprise edition,企业版,使用这种JDK开发J2EE应用程序,从JDK 5.0开始,改名为Java EE。

Java ME(J2ME),micro edition,主要用于移动设备、嵌入式设备上的java应用程序,从JDK 5.0开始,改名为Java ME。

没有JDK的话,无法编译Java程序,如果想只运行Java程序,要确保已安装相应的JRE。

下面来讲Java两个特殊的类Applet和Servlet

Applet是采用Java编程语言编写的,经过编译后Applet小程序可以嵌入到HTML中去(含有Applet的网页的HTML文件代码中部带有<applet> 和</applet>这样一对标记),然后client端的浏览器中只要安装JRE插件就可以在client端运行这个Apple应用小程序,并将结果显示在client上,这便是客户端动态网站

但是客户端动态网站有一很危险的地方,那就是如果有人给你往HTML网页中嵌入的是一个有害的applet程序,你在client一执行会对你的电脑造成破坏,而且applet的执行必须在client端安装有JRE,所以applet现在已经很少见了

HTML文件中关于Applet的信息至少应包含以下三点:

1)字节码文件名(编译后的Java文件,以.class为后缀)

2)字节码文件的地址

3)在网页上显示Applet的方式。

Servlet(Server Applplet)是用Java编写的服务器端程序,其主要功能为交互式的浏览和修改数据,生成动态的Web资源;Servlet可以让Java语言依据类似的CGI(common gateway interface)技术开发运行在服务器端的动态web资源,但在通信量大的服务器上,Java Servlet 的优点在于它们的执行速度更快于 CGI 程序。各个用户请求被激活成单个程序中的一个线程,而无需创建单独的进程,这意味着服务器端处理请求的系统开销将明显降低。

Servlet 的主要功能在于交互式地浏览和修改数据,生成动态 Web 内容。这个过程为:

1.客户端发送请求至服务器端;

2.服务器将请求信息发送至 Servlet;

3.Servlet 生成响应内容并将其传给服务器。响应内容动态生成,通常取决于客户端的请求;

4.服务器将响应返回给客户端。

JSP(Java Server Page)Java的服务器页面,它是Servlet的一个特殊的类,在根本上是一个简化的Servlet设计,JSP是在传统的网页HTML文件(*.html或*.htm)中插入Java的程序段,从而形成了JSP文件(通常为*.jsp);用JSP开发的web应用是支持跨平台的,既能在Linux上运行,也能在其他的操作系统上运行,开发JSP程序的一个著名框架是SSH(Structs、Spring、Hebernate)

JSP实现了Html语法中的java扩展(以 <%, %>形式)。JSP与Servlet一样,是在服务器端执行的。通常返回给客户端的就是一个HTML文本,因此客户端只要有浏览器就能浏览(Applet要在client上装JRE)。

注:

Applet只是将一个编译后的Applet小程序嵌入到HTML中然后发送到client,在client端依据JRE运行;

Servlet主要是实现了用Java语言开发运行在server端的Web动态资源;而这些依据Java语言开发的web动态资源大多数都是.jsp资源

JSP是一种脚本语言,主要实现了将JAVA代码嵌入到HTML中(这也是JSP和Servlet的最主要区别),从而生成了.jsp类的web动态资源,从而实现了基于Java技术的动态网站开发

JSP的运行性能要比PHP好,所以一些大型站点都用JSP开发,.jsp程序执行流程如下

  1. .jsp由Jasper处理未.java源程序
  2. .java由编译器编译为.class
  3. .class类在jvm上进行加载解释并运行

JSP 的运程过程

一个JSP页面有多个客户访问,下面是第一个客户访问JSP页面时候,JSP页面的执行流程:

客户通过浏览器向服务器端的JSP页面发送请求

  • JSP引擎检查JSP文件对应的Servlet源代码是否存在,若不存在转向第4步,否则执行下一步
  • JSP引擎检查JSP页面是否需要修改,若没修改,转向第5步,否则执行下一步
  • JSP引擎将JSP页面文件转译为Servlet源代码(相应的 .java 代码)
  • JSP引擎将Servlet源代码编译为相应字节码( .class代码 )
  • JSP引擎加载字节码到内存
  • 字节码处理客户请求,并将结果返回给客户

在不修改JSP页面的情况下,除了第一个客户访问JSP页面需要经过以上几个步骤外,以后访问该JSP页面的客户请求,直接发送给JSP对应的字节码程序处理,并将处理结果返回给客户,这种情况下,JSP页面既不需要启动服务器,以便重新加载修改后的JSP页面。

CGI(Common Gateway Interface)通用网关接口,CGI是外部应用程序(CGI程序)和Web服务器之间的接口标准(也可以理解为一种协议或机制),是在CGI程序和Web服务器之间传递信息的过程;CGI可以让一个客户端,从网页浏览器向执行在网络服务器上的程序传输数据CGI描述了客户端和服务器之间传输的一种标准

下面列子可以理解CGI的作用

客户端请求服务器,web服务器响应一个HTML静态的表单,而用户填写完表单后又将此表单交给了web服务器(相当于又一次http请求),web服务器收到client端填写的表单后会以CGI协议的方式提交给后端的应用程序让其处理

很多应用程序都可以传递参数,CGI可以让用户通过表单提供一些数据,然后把这些数据当做参数传递给相应的后端应用程序(如PHP)让程序对其加工处理(不过后端应用程序是PHP、C、C++甚至是一个脚本CGI都可以与其交互)让后端程序或脚本来处理数据,处理完后,后端程序再次通过CGI机制返回给前段的web服务器(httpd/Nginx)再由web服务器将结果封装响应给客户端

在LAMP和LNMP架构中PHP与前段Apache/Nginx之间就是通过CGI机制结合的,用于将客户端的动态请求(主要为php的动态资源请求)从前端web_server传递到后端的PHP,让PHP处理。

Servlet Container(Servlet容器):包含JDK及JDK所不具备的功能,可以让一个Servlet运行起来,有相应的Servlet进程,Servlet进程负责接收前端CGI传递来的请求,并在本地的JVM上运行处理,并且负责监控本地的.java程序是否发生了修改,一旦发生修改则重新让编译器(由JDK提供)编译成.class类

Web Container (Web容器)是一个包含Jasper和Servlet相关的技术的框架,其中Jasper负责监控本地的.jsp程序是否发生修改,一旦修改就根据需求将其装换为.java源代码,而.java就交给Servlet处理

注:Web Container比Servlet Container多了一个Jasper

而现在很多的Web容器都可以直接和用户的请求直接进行交互(即前端没有web server解码http请求和封装http响应)web容器可以完全依靠自己的组件(对Tomcat来说为web container的连接器)实现直接与client进行交互。但是让连接器直接面对用户的请求,可能会造成压力过大处理不过来的情况(如果连接器的性能不是很好),所以一般会在前端加一个web代理(如Nginx),让Nginx建立、维持、释放用户的请求和连接,而当用户的请求资源在前端web server(Nginx)上没有缓存时,再由Nginx将请求转发到后端web Container(如Tomcat)处理。而对应的这种架构叫:

Nginx + Java的Web Container(有时也成为应用程序服务器)

但无论是Web Container还是Servlet Container或者是JDK都是在JVM中运行的,Web Container|Servlet Container|JDK真正启动后再OS中表现的都是一个JVM进程(JVM实例),即在JVM中如果你是一个Web Containter它就有Web Container的功能,是JDK就有JDK的功能,负责只有JVM自身的功能

JVM实例可以在同一个JVM实例中启动多个线程,从而完成并发响应,JVM中还包括:

线程私有内存区

  1. 程序计数器
  2. Java虚拟机栈(主要用来保存本地变量)

线程共享内存区

  1. 方法区
  2. 堆(堆占用的内存最大)主要用来存储对象,当计数器为0时就认为对象已死,然后由GC(Garbage Collector)进行清除,避免堆溢出

而GC对对象的清理要依据一定的算法,有以下几种

  1. 标记清除算法(哪个对象死了先进行标记,然后统一清除),但这种机制有个弊端就是在GC进行垃圾清除时会让CPU飙升,造成服务器性能忽然下降,且会产生大量的内存碎片
  2. 复制算法,每个对象存两份,不会产生内存碎片但是内存使用率只有1/2

GC的种类

  1. serial 一次只能回收一个对象,串行
  2. parNew 一次可以回收读个,并行回收
  3. CMS(Concurrent Mark Sweet)并行标记清除,多线程,尽可能降低清除对JVM中程序的停顿,但缺点是无法收集浮动垃圾(只要线程在运行,就不能收集)
  4. G 1 特点是不会产生内存碎片、可以定义停顿的时间

祝大家新年快乐!!!2017 努力!奋斗!!!

时间: 12-31

运维角度的Java知识点总结的相关文章

从运维角度看中大型网站架构的演变之路

前言 网上有很多文章类似于我今天要分享的课程,有架构师写的,有运维写的,还有开发些的,偏重点都不同,今天我以咱们运维角度全面讲解. 一个成熟的网站架构并不是一开始设计就具备高可用.高伸缩.高性能等特性的,它是随着用户量和业务线不断增加,基础架构才逐渐健壮的.在发展初期,一般都是从0到1,不会一上来就整一些大而全的架构,也很少人这么任性. 说明 适用业务:电商/门户/招聘网站 开发语言:PHP和JAVA Web服务:Nginx/Tomcat8 数据库:MySQL 操作系统:CentOS 物理服务器

运维自动化之java编译自动化

[需求描述]     为了让代码开发之后,提升测试.部署上线的效率,需要将代码编译.部署过程自动化.     这里先介绍怎样使用javac自动化编译java代码.     因为项目目前暂未使用ant.maven等管理构建,所以需要使用比较原始的javac来实现,很伤有木有. [背景说明]     代码目录结构     1.web类型的代码:达成war包(就一目录),使用tomcat来部署 web类型的工程目录结构介绍# ls /home/souces/boss-websrc  WebConten

运维角度浅谈:MySQL数据库优化

日志君导读: 一个成熟的数据库架构并不是一开始设计就具备高可用.高伸缩等特性的,它是随着用户量的增加,基础架构才逐渐完善. 作者:zhenliang8,本文转自51CTO博客,点击原文阅读查看网页版文章. 本博文主要谈MySQL数据库发展周期中所面临的问题及优化方案,暂且抛开前端应用不说,大致分为以下五个阶段: 1.数据库表设计 项目立项后,开发部根据产品部需求开发项目,开发工程师工作其中一部分就是对表结构设计.对于数据库来说,这点很重要,如果设计不当,会直接影响访问速度和用户体验.影响的因素很

运维角度浅谈MySQL数据库优化

一个成熟的数据库架构并不是一开始设计就具备高可用.高伸缩等特性的,它是随着用户量的增加,基础架构才逐渐完善.这篇博文主要谈MySQL数据库发展周期中所面临的问题及优化方案,暂且抛开前端应用不说,大致分为以下五个阶段: 1.数据库表设计 项目立项后,开发部根据产品部需求开发项目,开发工程师工作其中一部分就是对表结构设计.对于数据库来说,这点很重要,如果设计不当,会直接影响访问速度和用户体验.影响的因素很多,比如慢查询.低效的查询语句.没有适当建立索引.数据库堵塞(死锁)等.当然,有测试工程师的团队

mysql分享一:运维角度浅谈MySQL数据库优化

转于:http://lizhenliang.blog.51cto.com/7876557/1657465 1.数据库表设计要合理避免慢查询.低效的查询语句.没有适当建立索引.数据库堵塞(死锁)等 2.数据库部署 项目初期访问量不会很大,所以单台部署足以应对在1500左右的QPS(每秒查询率).考虑到高可用性,可采用MySQL主从复制+Keepalived做双击热备,常见集群软件有Keepalived.Heartbeat. 双机热备博文:http://lizhenliang.blog.51cto.

(转)运维角度浅谈MySQL数据库优化

转自:http://lizhenliang.blog.51cto.com/7876557/1657465 一个成熟的数据库架构并不是一开始设计就具备高可用.高伸缩等特性的,它是随着用户量的增加,基础架构才逐渐完善.这篇博文主要谈MySQL数据库发展周期中所面临的问题及优化方案,暂且抛开前端应用不说,大致分为以下五个阶段: 1.数据库表设计 项目立项后,开发部根据产品部需求开发项目,开发工程师工作其中一部分就是对表结构设计.对于数据库来说,这点很重要,如果设计不当,会直接影响访问速度和用户体验.影

大型运维知识体系v2.0

转载请注明来自-运维社区https://www.unixhot.com/page/ops 运维知识体系-V2.0 By:2016年12月26日更新 运维架构层级/运维角度 内容描述/主要技术关键词 监控体系 安全体系 备份体系 自动化体系 云计算 客户端层 浏览器 Cookie.浏览器缓存协商(Last-Modified.Expires.Etag).组件分离.前端优化(提高浏览器并发数.避免静态资源Cookie上传).运维检测工具 舆论监控(第三方) 外部网络监控 APM 加速乐.牛盾.安全宝.

运维核心之一 CMDB

现在行行用电脑,处处需网络,做个判断还得需要大数据.任何一个公司,必须要有一个强大的IT支撑.现在每一个企业随着业务的发展,IT也东西也越来越多,突然有一天,你发现IT环境越发的复杂.工作量越来越大.于是,我们就开始想,以不能少让人干点活儿,大家纷纷走上运维自动化的道路了. 可是如何走上自动化运维的道路呢?在摸索的过程中,常常找不到着力点,无从下手.怎么办呢?我以为首先要做好以下准备,一共四个方面.这四个方面是基础和重点. 第一,  一个完备的CMDB. 第二,  一套适合自己的IT管理流程.

java运维面试的结果通过了

终于在12月份的初我完成了我自己的和java沾一点边的一个工作,那就是java运维工作,实在今年没有什么开发工作再找我面试了,所以我只好硬着头皮只要有关于java的面试工作我就去试试,现在的话我算是找到了一份java运维的工作,工资很低,但是暂时的话还可以,万事不能着急,一步一步的来吧,反正自己要是有志向,总会将来有成功地时候的!乘风破浪会有时,直挂云帆济沧海! 虽然我没有如愿以偿的去做开发,但是不管怎么说吧也算是有了一份可以不用再闲着的工作了,自己先好好干着,没事的时候多学习的也可以提升自己,