Android实现面试准备——java基础(一)
2022/1/20 17:14:20
本文主要是介绍Android实现面试准备——java基础(一),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
1、什么情况下会发生栈内存溢出
栈是线程私有的,每个线程运行时所需要的内存就叫做栈。每个方法执行的时候都会创建一个栈帧,用来存储局部变量表、方法参数、返回地址等信息,每个栈由栈帧组成,所以要么是栈帧过大导致栈内存溢出,要么是栈帧过多导致溢出。
根据平台的不同,线程栈的大小不同,Linux(64-bit)中是1M,也就是说很难因为栈帧过大导致栈内存溢出,那么主要就是因为栈帧过多了,这一般是方法的递归调用引起的。
public static void main(String[] args) { method1(); } private static void method1() { method1(); }
2、如果让你写一段栈溢出的代码你会什么写,一个栈大概有多大,为什么?每个线程都有这样大小的一个栈吗
代码就是上面写的那个,栈的大小根据平台的不同而不同,但是大多数64-bit的系统默认都是1M,除了window系统的默认栈大小根据虚拟内存而定。下面是oracle官网上关于JDK17的规范文档上关于默认栈大小的一些内容。
可以根据实际情况去调整栈的大小,但栈不是越大越好,因为栈越大,内存有限,能使用的线程就越少,可能会造成CPU资源的浪费。栈大一点只是保证能进行更多的循环调用,对于程序运行效率等并没有什么帮助。
每个线程创建的时候如果不指定大小,默认都会创建1M的栈。可以通过-Xss size来调整线程栈的大小。
3、JVM中一次完整的GC流程是怎样的,对象如何晋升到老年代
新对象创建时默认采用伊甸园Eden中的空间,Eden空间不足的时候会触发minor gc,将Eden和幸存区from中存活的对象复制到幸存区to中,并将对象年龄加1,然后交换from和to。当老年代的空间也不足时,就会触发full gc
幸存区中的对象寿命如果超过阈值(默认15),就会晋升到老年代。
4、介绍下GC回收机制与分代回收策略
(1)什么是垃圾:以GC root对象为起始点往下搜索,搜索走过的路径称为引用链,通过判断引用链是否可达决定某个对象是不是垃圾,也就是能不能被回收。
(2)GC root对象:
a. 虚拟机栈中局部变量表引用的对象(正在执行的方法中局部变量指向的对象)
b. 方法区中静态引用指向的对象(类中static修饰的变量指向的对象)
c. 方法区中常量引用的对象
d. 仍处于存活状态中的线程对象
e. Native方法中JNI引用的对象
(3)引用类型
a. 强引用:若强引用还存在,垃圾回收器绝不会回收被引用的对象
b. 软引用:内存不足时会对软引用的对象进行回收
c. 弱引用:无论内存是否足够,都会对弱引用对象进行回收
d. 虚引用:和对象生存时间没有关系,只是被回收时会收到系统通知
(4)垃圾回收算法
a. 标记-清除算法:通过可达性分析之后存活的对象保留,需要回收的对象进行标记,然后将其起始地址和结束地址放到一个空闲地址链表中,下一次内存分配的时候从这个链表中进行查找。这个方法速度快,但是容易产生内存碎片。
b. 标记-整理算法:通过可达性分析之后,将存活的对象都整理到内存的一端,并清理边界之外的空间。这个方法不会产生内存碎片,但是牵扯到对象的移动,地址的改变,速度慢。
c. 复制算法:将现有的内存空间分为两块,称为from区和to区。首先进行可达性分析,将from中存活的对象复制到to区,然后交换from和to。这个方法不会产生内存碎片,但是会占用双倍的内存空间。
(5)分代回收
其中心思想就是:新创建的对象在新生代中分配内存,此区域的对象一般生命周期较短,垃圾回收的效率也很高,一般采用的是复制算法。如果经过多次垃圾回收后依然存活,则晋升至老年代中。
新生对分为伊甸园Eden区、from区和to区,新对象创建时默认采用伊甸园Eden中的空间,Eden空间不足的时候会触发minor gc,将垃圾对象回收清除,并将Eden和幸存区from中存活的对象复制到幸存区to中,并且对象年龄加1,然后交换from和to。 幸存区中的对象寿命如果超过阈值(默认15),就会晋升到老年代。如果新创建的对象比较大,并且新生代空间不足,也会直接放至老年代。
而老年代的对象因为生命周期较长,不需要过多的复制操作,一般采用标记-整理算法。
这篇关于Android实现面试准备——java基础(一)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解
- 2024-11-23Java对接阿里云智能语音服务入门教程
- 2024-11-23JAVA对接阿里云智能语音服务入门教程
- 2024-11-23Java副业入门:初学者的简单教程
- 2024-11-23JAVA副业入门:初学者的实战指南