一、JDK、JRE 、JVM 的区别
什么是JDK
Jdk【Java Development ToolKit】就是java开发工具箱, JDK是整个JAVA的核心里边包含了jre,它除了包含jre之外还包含了一些javac的工具类,把java源文件编译成class文件,java文件是用来运行这个程序的,除此之外,里边还包含了java源生的API,java.lang.integer在rt的jar包里边【可以在项目中看到】,通过rt这个jar包来调用我们的这些io流写入写出等
JDK有以下三种版本:
J2SE,standard edition,标准版,是我们通常用的一个版本
J2EE,enterpsise edtion,企业版,使用这种JDK开发J2EE应用程序
J2ME,micro edtion,主要用于移动设备、嵌入式设备上的java应用程序
三者之间的关系:
Java SE(Java Platform, Standard Edition,Java标准版)就是基于JDK和JRE的
Java SE为Java EE提供了基础
Java EE除了基于我们这个所谓的Java SE外,还新加了企业应用所需的类库
JDK常用的包:
java.lang: 这个是系统的基础类,比如String、Math、Integer、System和Thread提供常用功能
java.io: 这里面是所有输入输出有关的类,比如文件操作等
java.net: 这里面是与网络有关的类,比如URL,URLConnection等
java.util : 这个是系统辅助类,特别是集合类Collection,List,Map等
java.sql: 这个是数据库操作的类,Connection, Statememt,ResultSet等
什么是JRE
Jre是Java运行时换将 ,什么是Java运行时环境 就是为了保证Java程序能够正常运行所必备的基础的环境,也就是说jre只能保证Java正常运行 但是不能用来开发 JDK才是用来开发的,所有的程序都必须在jre的环境下才能正常运行,当然要保证jre的运行 jvm是必不可少的,因为jre里面就包括jvm jre运行时环境依赖于jvm,
什么是jvm
Jvm就是Java虚拟机,Java虚拟机是用来加载类文件的,Java之所以有跨平台的作用,也是因为Java虚拟机
Java虚拟机里面的内存结构分为 栈 、堆 、和 方法区
堆里面存放的就是对象实例也就是new出来的对象
栈里面存放的是基本数据类型和引用数据类型的地址
方法区里面存放的是常量
内存泄漏和内存溢出
内存泄漏是应用程序在申请内存后,无法释放已经申请的内存空间,一次内存泄漏可以被忽略,但是内存泄漏一直产生的话,后果会非常严重,它会导致内存溢出,所以在读取文件后流要进行及时的关闭、以及对数据库连接的释放
内存泄漏常出现的几种形式
· 常发性内存泄漏。发生内存泄漏的代码会被多次执行到,每次被执行的时候都会导致一块内存泄漏。
· 偶发性内存泄漏。发生内存泄漏的代码只有在某些特定环境或操作过程下才会发生。常发性和偶发性是相对的。对于特定的环境,偶发性的也许就变成了常发性的。
· 一次性内存泄漏。发生内存泄漏的代码只会被执行一次,比如,在类的构造函数中分配内存,在析构函数中却没有释放该内存,所以内存泄漏只会发生一次。
· 隐式内存泄漏。程序在运行过程中不停的分配内存,但是直到结束的时候才释放内存。严格的说这里并没有发生内存泄漏,因为最终程序释放了所有申请的内存。但是对于一个服务器程序,需要运行几天,几周甚至几个月,不及时释放内存也可能导致最终耗尽系统的所有内存。所以,我们称这类内存泄漏为隐式内存泄漏。从用户使用程序的角度来看,内存泄漏本身不会产生什么危害,作为一般的用户,根本感觉不到内存泄漏的存在。真正有危害的是内存泄漏的堆积,这会最终消耗尽系统所有的内存。从这个角度来说,一次性内存泄漏并没有什么危害,因为它不会堆积,而隐式内存泄漏危害性则非常大,因为较之于常发性和偶发性内存泄漏它更难被检测到
内存溢出
内存溢出是程序在申请内存时,没有足够的内存空间供它使用,就会出现内存溢出
内存溢出的几种形式
1. 某些函数里存在不合理的递归现象
2. 通过Reader类读取很大的数据(比如10G),则有可能造成内存溢出的问题
]3. 加载的图片过大
网友评论