1. JDK和JRE的区别
-
JDK是整个JAVA的核心,包括了Java运行环境JRE,一堆Java工具和Java基础的类库。通过JDK开发人员将源码
文件(java文件)编译成字节码文件(class文件)。
-
JRE是Java运行环境,不含开发环境,即没有编译器和调试器。将class文件加载到内存准备运行
2. 讲一讲Java内存的堆(heap)、栈(stack)和方法区(method)
-
栈:调用方法将在栈中开辟内存,称为入栈(压栈)。
- 栈内存存放基本类型值和引用数据类型的地址。
- 栈内存中的数据,没有默认初始化值,需要手动设置。
- 方法调用完成,栈内存立即释放,称为出栈(弹栈)。
-
堆:用于存放使用new创建的对象或数组。
-
所有的对象都有内存地址值。
-
数据都有默认初始化值。
-
堆内存中的对象不再被指向时,JVM启动垃圾回收机制,自动清除。
-
方法区:与Java堆一样,是各个线程共享的内存区域。
-
存储已被Java虚拟机加载的类信息、常量、静态变量、以及编译器编译后的代码等。
-
3. GC是什么? 为什么要有GC?
-
GC是垃圾收集的意思。
-
是指JVM用于释放那些不再使用的对象所占用的内存。垃圾回收可以有效的防止内存泄露
有效的使用可以使用的内存。Java有了GC,就不需要程序员去人工释放内存空间。
4. 在java中,对象什么时候可以被垃圾回收?
-
一般情况下java中对象可被回收的前提是:该对象不再被引用。
然后垃圾回收器在回收的时候便会把这个对象清理掉
-
垃圾回收机制的算法:
-
引用计数算法:
-
给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;
当引用失效时,计数器 值就减1;
任何时刻计数器都为0的对象就是不再被使用的,垃圾收集器将回收该对象使用的内存。
-
-
根搜索算法:
-
过一系列的名为“GC Root”的对象作为起点,从这些节点向下搜索
搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Root没有任何引用链相连 时,则该对象不可达,该对象是不可使用的,垃圾收集器将回收其所占的内存。
-
5. java中会存在内存泄漏吗,请简单描述。
- 会存在,
- 泄漏是指程序分配的内存未释放或无法释放的现象。
- java中内存泄露的发生场景:全局的集合变量、不正确的单例模式的使用