Java面试

来源:互联网 发布:java编程思想第五版 编辑:程序博客网 时间:2024/05/19 15:24

二面:

1.Java内存分配方式有几种?

1).     静态存储区域分配内存。编译时内存已经分配好了,并且在整个运行过程中都存在,如全局变量

2).     栈分配内存。函数内局部变量的存储单元可以在栈上创建,函数结束时存储单元自动释放。处理器指定栈内存的分配运算,效率高,但内存容量有限。

3).     堆分配内存,动态分配,运行时,使用new运算符申请任意大小的内存,使用free函数或者delete运算释放内存,灵活。


2.Java虚拟机运行时的数据区。

1)程序计数器:Java多线程通过线程轮流切换并分配处理器执行时间的方式来实现的。

2)Java虚拟机栈线程私有。每个方法都会创建栈帧,用于存储局部变量表,操作数栈,动态连接等。为虚拟机执行Java方法服务。

3)本地方法栈:为虚拟机使用到的native方法服务。同(2)也会抛出StackOverflowError 和OutofMemoryError异常。

4)Java堆:被所有线程共享的一块内存区域,虚拟机启动时创建,目的:存放对象实例。垃圾收集器管理的主要区域。

5)方法区:各线程共享,存储被类加载的类信息、常量、静态变量、即编译器编译后的代码

3.堆、栈区别总结:

1).堆栈空间分配

栈由操作系统自动分配,存放函数的参数值,局部变量值等

堆由程序员分配释放,若程序员不释放,程序结束时,可能OS回收。

2). 堆栈缓存方式

栈使用一级缓存,被调用时处于存储空间,调用完毕立即释放。

堆使用二级缓存,生命周期由虚拟机的垃圾回收算法来决定。

3).堆栈数据结构区别

栈可以看作先进后出的数据结构

堆可以被看作一棵树,如堆排序


4.内存泄露:

由于疏忽或错误造成程序未能释放,首先,这些对象是可达的,其次这些对象是无用的。

1) 静态集合类:使用set、vectorhashmap等集合类时,他们的生命周期和应用程序一样长,可能内存泄漏。将Vector设置为null。

2) 监听器:调用控件,没有释放。

3) 物理连接,数据库连接、网络连接,除非显示关闭,否则不会被gc。

4) 内部类和外部类的引用,忘记释放可能导致一系列的后继对象没有释放。

5) 单例模式:单例对象初始化后将在JVM的整个生命周期内存在,如果有外部对象引用,就不能回收。


5.垃圾回收机制:基于JVM内存回收的三种算法:

1) 标记-清除:标记出根节点开始的对象,然后把这些对象在内存的信息清除。

2) 复制算法:原内存只使用一块,垃圾回收时将正在使用的存活对象复制到未使用的内存中,清除正在使用内存块中的对象。

3) 标记整理:标记根节点开始的可达对象,将存活对象压缩到内存的一块,之后清理边界所有空间。





原创粉丝点击