Java基础知识(Java平台与内存管理),
Java基础知识(Java平台与内存管理),
说明:其中内容摘自:《Java程序员面试宝典》,这里仅供学习使用。(P125)
1. 为什么说Java是平台独立性语言??
平台独立性是指可以在一个平台上编写和编译的程序,可以在其他平台上运行。Java实现平台独立性的机制为“中间码”和“JVM”。Java程序被编译后不是直接生成在硬件平台上执行的机器码,而是生成一个中间码。不同的硬件平台上安装有不同的JVM,JVM可以负责将中间码解释为该硬件平台上可以执行的机器码。因此Java是平台无关的,但JVM不是。
JVM解释Java代码的过程分为三步:代码的装入,代码的校验和代码的执行。
Java字节码的执行分为两种方式:
Java代码的执行过程:Java代码(Student.java)->编译器编译->Java中间代码(class字节码文件:Student.class)-> 类加载器加载字节码文件 -> JVM解释执行(main方法)。
2. JVM加载class字节码文件的原理机制是什么?
class字节码文件由类加载器完成,加载方式有两种:
Java中,类的加载是动态的,它并不会一次将所有的类全部加载后再执行,而是保证程序运行的基础类完全加载到JVM中,其他类在需要用到的时候在加载。
3. 什么是GC?
Java语言提供了垃圾回收器来自动检测对象的作用域,可以自动地不再被使用的存储空间释放掉。GC回收器负责完成3项任务:
- 分配内存
- 确保被引入对象的内存不被错误的回收
- 回收不再被引用的对象的内存空间
优点:GC的存在一方面把开发人员从释放内存的复杂工作中解脱出来,提高了开发人员的生产效率。另一方面,对开发人员屏蔽了释放内存的方法,可以避免因开发人员错误的操作内存而导致的程序崩溃,保证了程序的稳定性。
对对象而言,如果没有任何变量去引用它,那么该对象将不可能被程序访问,因此可以认为他是垃圾信息,可以被回收。只要有一个以上的变量引用该对象,该对象就不会被垃圾回收。
对于GC器来言,它使用有向图来记录和管理内存中的所有对象,如果对象在图中是不可达的,则需要被垃圾回收。
垃圾回收都是依据一定的算法进行的,例如:
- 引用计数算法
- 追踪回收算法
- 压缩回收算法
- 复制回收算法
- 按代回收算法。内存中的区域被划分为不同的世代,对象根据其存活时间被保存在对应世代的区域中。一般的实现是划分为3个区域:年轻,年老和永久。内存的分配在年轻世代中进行,当一个对象存活的时间过长,它就会被复制到年老的世代中,对于不同世代可以使用不同的垃圾回收算法。
进行世代划分的出发点是对应用中对象存活时间进行研究后得到的统计结果,一般来说,一个应用中的大部分对象的存活时间都很短,因此对年轻代的垃圾回收算法就可以很有针对性。
4. Java中是否存在内存泄漏问题?
内存泄漏是指一个不再被程序使用的对象或变量还在内存中占有着空间。
Java中判断一个内存空间是否符合垃圾回收标准两个:
- 对象赋值为null,以后再也没被使用过
- 给对象赋值了新值,重新分配了内存空间
一般来说,内存泄漏主要有两种情况:
垃圾回收机制可以有效的解决第一种情况,但对于第二种情况,GC无法保证不再使用的对象会被释放。因此,Java中内存泄漏主要 是指第二种情况。
Java中容易造成内存泄漏的原因很多,主要有:
- 静态集合。例如HashMap为静态的,它的声明周期和程序一致,那么容器中的对象在程序结束前都不能被释放,从而造成内存泄漏。
- 各种连接。数据库连接,IO连接,网络连接。当建立的连接不再使用时,需要调用close方法释放连接。如果没有显示的关闭,则会造成大量对象无法被回收。
- 监听器。java中常使用监听器,但在释放对象的同时往往没有删除相应的监听器对象,从而导致内存的泄漏。
- 变量的不合理作用域。如果一个变量定义的作用范围大于其使用范围,很可能造成内存泄漏。另一方面,如果没有及时的把对象设置为null,也有可能导致内存的泄漏。
5. Java中的堆和栈有什么区别?
- 在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配,当在一段代码块定义一个变量时,Java 就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java 会自动释放掉为该变量分配的内存空间,该内存空间可以立即被另作它用。
- 堆内存用来存放由 new 创建的对象,在堆中分配的内存,由 Java 虚拟机的自动垃圾回收器来管理。
- 栈中的变量指向堆内存中的变量,这就是 Java 中的指针。
相关文章
- 暂无相关文章
用户点评