总述
从接触Java开发到现在,对Java语言的特点除了它宣传的“write once,run anywhere”,相信对Java平台也有一定的见解。Java本身是一种面向对象的语言,最显著的特性有两个方面,一是所谓的跨平台性,一是垃圾回收机制。对于跨平台,java语言跨平台,但是java虚拟机(JVM)不跨平台。Jvm在java语言中充当“翻译官”的角色,不同的平台jvm不同(平台这里指的是操作系统)。既然谈到jvm,那jdk,jre,jvm的关系不得不说了。
JDK、JRE、JVM的关系
JDK: java development kit, java开发工具包,针对开发者,里面主要包含了jre, jvm, jdk源码包,以及bin文件夹下用于开发,编译运行的一些指令器。
JRE: java runtime environment, java运行时环境,针对java用户,也就是拥有可运行的.class文件包(jar或者war)的用户。里面主要包含了jvm和java运行时基本类库(rt.jar)。rt.jar可以简单粗暴地理解为:它就是java源码编译成的jar包(解压出来看一下),用eclipse开发时,当你ctrl点击发现不能跳转到源文件时,需要把rt.jar对应的源码包加进来,而这里的源码包正是jdk文件夹下的src.zip。
JVM: java虚拟机,将它理解为可以识别class文件的一个小型系统,class文件直接和它交互,所以它让class文件和用户真实的操作系统隔离,屏蔽了用户系统的差异性,给人一种感觉就是java出道的最大特点:一次编译,处处运行(跨平台)。而这也正是java跨平台引起过争议的一点,曾经一些人觉得java跨平台是个幌子,因为前提是用户机子上必须安装了JVM(准确地说是JRE)。
抽象问题具体化理解:
JDK包含了JRE,JRE包含了JVM。
你现在想用一段代码对全世界用计算机的人们说一句:hello world, 你首先想到可以将这两个单词写在每个用户计算机txt的里面,这太麻烦了,有些用户不是windows系统,他没有txt文件,你不知道怎么写,需要的是代码实现。然后你程序猿朋友在txt里面写了一个main,main里面写一句system.out.println("hello world"); 私下里 编译之后给到了你,说它很神奇,把它运行起来就能达到目的,你查了一下有个JVM的东西能运行这个文件,但是失败了,原因是JVM没那么智能,它不知道里面system, out, println这三个单词是用来做什么的,朋友告诉你要安装JRE,你安装后惊奇发现成功了。后来你逮谁就找谁实验,你只需要把JRE和你朋友给你的这个文件放上去,就能跟他说hello world。你按捺不住内心的崇拜之情,对朋友说:大牛,带我飞吧。朋友微微一笑,抛给你一个JDK,说拿去玩吧这就是武功秘籍。从此你踏上了java开发的不归路。
垃圾回收机制(GC)
一:垃圾回收机制的意义
java 语言中一个显著的特点就是引入了java回收机制,是c++程序员最头疼的内存管理的问题迎刃而解,它使得java程序员在编写程序的时候不在考虑内存管理。由于有个垃圾回收机制,java中的额对象不在有“作用域”的概念,只有对象的引用才有“作用域”。垃圾回收可以有效的防止内存泄露,有效的使用空闲的内存;
内存泄露:指该内存空间使用完毕后未回收,在不涉及复杂数据结构的一般情况下,java的内存泄露表现为一个内存对象的生命周期超出了程序需要它的时间长度,我们有是也将其称为“对象游离”。
二:Java有了GC同样会出现内存泄露问题
1.静态集合类像HashMap、Vector等的使用最容易出现内存泄露,这些静态变量的生命周期和应用程序一致,所有的对象Object也不能被释放,因为他们也将一直被Vector等应用着。2.各种连接,数据库连接,网络连接,IO连接等没有显示调用close关闭,不被GC回收导致内存泄露。
3.监听器的使用,在释放对象的同时没有相应删除监听器的时候也可能导致内存泄露。