说说JVM原理?内存泄漏与溢出的区别?什么时候产生内存泄漏?

一、JVM原理

JVM是Java Virtual Machine(Java虚拟机)的缩写,它是整个java实现跨平台的最核心的部分,全部的Java程序会首先被编译为.class的类文件,这种类文件能够在虚拟机上执行,也就是说class并不直接与机器的操做系统相对应,而是通过虚拟机间接与操做系统交互,由虚拟机将程序解释给本地系统执行。JVM是Java平台的基础,和实际的机器同样,它也有本身的指令集,而且在运行时操做不一样的内存区域。JVM经过抽象操做系统和CPU结构,提供了一种与平台无关的代码执行方法,即与特殊的实现方法、主机硬件、主机操做系统无关。JVM的主要工做是解释本身的指令集(即字节码)到CPU的指令集或对应的系统调用,保护用户免被恶意程序骚扰。JVM对上层的Java源文件是不关心的,它关注的只是由源文件生成的类文件(.class文件)。java

二、内存泄漏与溢出的区别

1) 内存泄漏是指分配出去的内存没法回收了。数据库

2) 内存溢出是指程序要求的内存,超出了系统所能分配的范围,从而发生溢出。好比用byte类型的变量存储10000这个数据,就属于内存溢出。网络

3) 内存溢出是提供的内存不够;内存泄漏是没法再提供内存资源。操作系统

三、什么时候产生内存泄漏

1) 静态集合类:在使用Set、Vector、HashMap等集合类的时候须要特别注意,有可能会发生内存泄漏。当这些集合被定义成静态的时候,因为它们的生命周期跟应用程序同样长,这时候,就有可能会发生内存泄漏。设计

2) 监听器:在Java中,咱们常常会使用到监听器,如对某个控件添加单击监听器addOnClickListener(),但每每释放对象的时候会忘记删除监听器,这就有可能形成内存泄漏。好的方法就是,在释放对象的时候,应该记住释放全部监听器,这就能避免了由于监听器而致使的内存泄漏。对象

3) 各类链接:Java中的链接包括数据库链接、网络链接和io链接,若是没有显式调用其close()方法,是不会自动关闭的,这些链接就不能被GC回收而致使内存泄漏。通常状况下,在try代码块里建立链接,在finally里释放链接,就可以避免此类内存泄漏。生命周期

4) 外部模块的引用:调用外部模块的时候,也应该注意防止内存泄漏。如模块A调用了外部模块B的一个方法,如:public void register(Object o)。这个方法有可能就使得A模块持有传入对象的引用,这时候须要查看B模块是否提供了去除引用的方法,如unregister()。这种状况容易忽略,并且发生了内存泄漏的话,比较难察觉,应该在编写代码过程当中就应该注意此类问题。内存

5) 单例模式:使用单例模式的时候也有可能致使内存泄漏。由于单例对象初始化后将在JVM的整个生命周期内存在,若是它持有一个外部对象(生命周期比较短)的引用,那么这个外部对象就不能被回收,而致使内存泄漏。若是这个外部对象还持有其它对象的引用,那么内存泄漏会更严重,所以须要特别注意此类状况。这种状况就须要考虑下单例模式的设计会不会有问题,应该怎样保证不会产生内存泄漏问题。(来自 尚学堂资源

相关文章
相关标签/搜索