java基础与环境

java


  • 简述

  • java基础

  • jvm

  • java环境搭建


简述

什么是java?

java是一门面向对象的编程语言,具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点,特别是可移植性,java所有的代码都需要在一个特定的虚拟环境中实现,所以可移植性方面非常好,一次编译,永久使用。

java可以做到什么?

Java可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等。

java基础

java组件结构

java根据组件的不同,大致可分为三类:

java2 se:java 2 Standard Edition(标准版),组件主要为JDK,支持桌面应用程序编程。
java2 ee:java 2 Enterprise Edition(企业版),组件为JDK加上web容器组成,可以视为是se的升级版,主要用于动态网页程序开发。  
java2 me:java 2 mobile Edition(移动版),组件为JDK加上mobile容器组成,可以视为是se的升级版,主要用于移动端的程序开发。

jdk

JDK是jiva的基础开发工具包,是整个java开发的核心,不管是向上扩展的ee me都是以jdk为核心,jdk主要包含了jvm,java的工具,java的基础类库。

java2 ee

java2ee是java的web开发包的范式规定,定义了java2ee需要包含java2se的所有内容并且增添了serverlet,JDBC,EJB,JMX,JSP等一众组件,并且基于这个范式,有众多的商业版和开源版实现软件。

serverlet (Server Applet):允许在java代码中嵌入html代码。
JDBC (Java Database Connectivity):提供连接各种关系型数据库的统一API。
EJB (Enterprise JavaBeans):创建,部署,跨平台管理的java组件。
JMX (Java Management Extensions):为应用程序,系统植入管理功能的工具。
JSP (Java Server Pages):是一种简化的serverlet,通过在html中嵌入java程序段来实现动态网页的开发,但实际上是通过JAVA2ee的转换器实现的。

关于JSP与serverletL:
    JSP的代码会被服务端给翻译成serverlet的形式,之后才会去编译成类放在JVM上运行。

java2 ee 的实现:
    商业:                        开源:
          Websphere                     Tomcat
          Weblogic                     Jetty
          oc4j                       Resin
          JBoss

编程的名词解释

对象(Object):在内存上一段有意义的区域,是类的一个实例。
类(Class):是具有共同特征的对象的集合。
方法(method):是对象能实现的一个操作,一个动作。

java代码的运行流程

source code -> 编译(compile) -> class -> class load -> jvm -> OK

流程

在java中,所有的程序都是通过类调用的方式来运行,包括对库调用也是使用的调用类库来实现的,并且所有的程序都是运行在java虚拟机上,所以才能做到一次编译,到处运行。

linux中的环境变量

JAVA_HOME : 需要在linux中自行设定此变量,很多JAVA应用程序都会去通过这个变量去寻找java的程序路径。

jvm

jvm是jdk中不可缺少的一环,jvm提供了java程序的运行环境,才使得做到一次编译,到处运行。

运行时区域:

JVM的运行时空间

JVM运行时,也会占据内存空间,我们称这段空间为 jvm的运行时区域:

方法区:存放jvm中的静态变量,常量,方法等。
java堆(heap):主要存放对象的区域,也是GC的主要工作区,更替速度快。
java栈(stack):存放了java中的局部变量和局部变量表等信息。
pc计数器:存放了代码执行到的行数和指向下一行代码的指针,"类似"于cpu的指令指针寄存器的效用。
本地方法栈(stack):存放了本地主机中的局部变量和变量表信息。

heap区域

heap

jvm的运行时区域中,heap区是占据了最大的空间并且也是GC垃圾处理器的主要工作区域,因为heap中存放了所有的对象,并且对象的更替十分平凡。
heap区主要分为三代,年轻代,老年代和持久代,根据对象的存活时间来划分:

young:年轻代,共分为三部分。
    eden:存放了新生的对象。
    from:当产生了新的对象时,原来的新生对象如果存活就会被移动到这个区域中。
    to:前两个都有垃圾需要清理时,继续存活的对象就会被移动到这个区域中。

tenured:老年代,当年轻代中来回移动的数据集合中,有一个数据存活时间达到指定程度就会将其移动到老年代中,并标识成为长期的一个对象,不会被轻易清理。

perm:永久代,之中的对象永远不会被清理。

reserved:预留空间,每一个代中都会有这个区域,当heap初始时,并不会分配给每个区域所有的空间,而是会随着使用量来慢慢增加至最大值。

young中之所以要存在三个区域,是因为要提供其中的对象的相互移动,to和from区域一定会有一个区域不处于GC状态,所以,当其他两个区域出现GC时,就会将还存活的对象移动到没有GC的区域中(不会是eden区),并且会根据存活时间来判断是否已经达到了老年代的移动资格,GC是非常重要的一环。

young中的对象活动非常频繁,所以对比老年代,年轻代产生了大量的对象,但是很少会存活到老年代,所以年轻代会产生大量的垃圾需要清理。

GC

新生代回收: 
        minor GC
    回收过程:
        1.当eden中产生垃圾后,先将存活的对象放入to区,并清理eden区。
        2.存放了新生对象的eden区和to区产生新的垃圾,就会将所有存活对象放入from区,并清理其他两个区。
        3.当继续存放了新生对象的eden区和from产生垃圾时,就会将所有存活对象重新放入to区,并清理其他区。
        4.如此循环,直到其中有坚强的依然存活的对象存活时间达到标准后,才会将那个对象单独拉出来放入老年代,其他行为继续进行。



老年代回收:
        major GC (Full GC)
    回收过程:
        1.先遍历老年代,将所有的垃圾mark一下。
        2.之后再去将所有已经标记的对象打包归档一块儿清除。

会产生的问题:

由于GC不会同步进行,而是在相同时间差才清理一次,所以如果垃圾非常多,一次清理的量也会非常大,这样就会占用大量的进程资源,导致所有java进程都被GC给占用了,导致其他的java进程暂时停顿无法运行,就会有那么一段时间的stop.

特别是老年代的GC处理,要通过遍历老年代并标记后才会去归档打包清理,更加消耗进程资源,所以当产生了major GC后,系统卡壳的情况就会非常明显。

jvm参数

-XMX                    所有的young和tenured的max空间总和。
-XMS                    young和tenured的初始空间总和。
-XX:NewSize            新生代的初始空间和。
-XX:MaxNewSize        新生代的MAX空间和。
-XX:Permsize            持久代的初始空间和。
-XX:MaxPermSize        持久代的max空间和。
...
更多参数可以查阅文档。

jvm的参数通过java命令行来传递,如

/usr/local/jdk/bin/java -Dresin.home=/usr/local/resin -server -Xms1800M -Xmx1800M  -XX:PermSize=300M -XX:MaxPermSize=300M

jvm的性能监控

jps    
jstack [option] PID
jmap
jhat
jstat

GUI:jconsole jvisualvm

java环境搭建

# yum install jdk-release.rpm   可以通过直接下载安装jdk包或者通过yum命令去yum仓库中下载安装,centos6和7的base源中提供了openjdk的版本。
# echo "export JAVA_HOME=/usr/java/latest"    >  /etc/profile.d/java.sh        设置JAVA环境变量
# . /etc/profile.d/java.sh        重读文件。

如果需要其他版本的jdk,可以自行去net搜索安装即可。

原创文章,作者:Net18_肖肖,如若转载,请注明出处:http://www.178linux.com/19865

(0)
上一篇 2016-06-23 11:13
下一篇 2016-06-24 12:48

相关推荐

  • Linux的终端类型

    Linux的终端类型       终端是一种字符型设备,它有多种类型,通常使用tty来简称各种类型的终端设备,linux终端大致有设备终端,物理终端、虚拟终端、图形终端、串行终端、伪终端等。 一.设备终端   设备终端的是一些看的见摸得着的一些实物,比如鼠标、键盘、显示器、打印机等之类的实物。 二.…

    Linux干货 2016-10-14
  • 系统管理之系统启动及内核编译

    CentOS 5和6的启动流程服务管理Grub管理自制Linux启动排错编译安装内核 系统启动流程:  POST –> 读取BootSequence (BIOS),决定引导次序 –>读取引导设备的Bootloader(MBR grubstage1–>stage1.5/boot…

    Linux干货 2016-09-13
  • 关于磁盘管理的例子

    今天来说一个关于磁盘管理的例子,通过这个例子也顺便了解一下此例子涉及到的一些相关命令、文件。 练习:创建一个2G的文件系统,块大小为2048byte, 预留1%可用空间,文件系统ext4,卷标为TEST,要求此分区开机后自动挂载至/test目录,且默认有acl挂载选项 思路:1.在/etc/fstab中定义开机自动挂载信息    &nbs…

    Linux干货 2017-08-19
  • 设计模式 ( 十六 ) 观察者模式Observer(对象行为型)

    1.概述 一些面向对象的编程方式,提供了一种构建对象间复杂网络互连的能力。当对象们连接在一起时,它们就可以相互提供服务和信息。 通常来说,当某个对象的状态发生改变时,你仍然需要对象之间能互相通信。但是出于各种原因,你也许并不愿意因为代码环境的改变而对代码做大的修改。也许,你只想根据你的具体应用环境而改进通信代码。或者,你只想简单的重新构造通信代码来避免类和类…

    Linux干货 2015-07-24
  • 第五周作业

    1、显示当前系统上root、fedora或user1用户的默认shell; [root@localhost ~]# awk -F: '/^(root|user1|fedora)/{print $1,"shell is",$NF}' /etc/pass…

    Linux干货 2016-09-15
  • liunx初探

    计算机的五大单元: 输出单元、输入单元、cpu内部控制单元、算术逻辑单元和内存。 计算机三大组成部分: 输入单元:键盘、鼠标等等 输出单元:屏幕、打印机等 中央处理器(CPU):含有算术逻辑、控制、记忆等 CPU种类有两种分别是:   精简指令集(RISC):这种cpu微指令比较精简,每个指令的执行时间都很短,完成的操作也很简单。常见的简单指令集C…

    Linux干货 2016-09-14