总结常见的Java碎片化知识点,便于日后记忆翻阅
Java基础知识整理
JVM:
- 什么情况下会发生栈内存溢出?StackOverFlow 与 OOM 的区别?分别发生在什么时候?
- 虚拟机栈区域有两个异常:
- StackOverflowError:当线程请求栈深度超出虚拟机栈所允许的深度时抛出
- OutOfMemoryError:当Java虚拟机动态扩展到无法申请足够内存时抛出
- 递归太深;数组声明太大(方法区),创建对象太多(堆),创建线程太多(栈)
- 如果让你写一段栈溢出的代码你会什么写,一个栈大概有多大,为什么?每个线程都有这样大小的一个栈吗?
- 无限递归
- -Xss分配大小,JDK1.5+默认为1M
- 栈内存是线程私有空间,决定方法调用深度,每个线程都有一个独立的可配置大小的栈,一个函数内的所有函数使用的空间都依赖这个栈,太多变量参数可能导致溢出
- 不要在函数内部定义过大局部变量,不要将过大的结构体通过参数传递,注意递归
- JVM 栈中存储的是什么,堆存储的是什么?
- 栈是线程独有,在栈中每个方法对应一个栈帧,栈帧中有局部变量表,引用等数据
- 堆是公用区域,非线程独有。存储对象。
- Java 对象会不会分配到栈中?
- 不会
- C++中有,会随着方法的退出而销毁,减轻GC开销
- Java逃逸分析(主要分析对象的作用域),判断一个对象会不会逃逸到方法或线程之外。
- JVM,DVM,ART的区别
- JVM是Java虚拟机,运行的是class文件
- DVM可以说是Android虚拟机(实际为认证),.class——.odex,65535问题,所以安装时需要合包
- ART还会优化为.oat文件,不用合包
- PathClassLoader 与 DexClassLoader 的区别是什么?
- PathClassLoader只支持直接操作.dex,或已安装APK(已安装的在cache中存在dex)
- DexClassLoader支持.apk,.jar,.dex且会在指定classPath释放dex
- 什么是双亲委托机制,为什么需要双亲委托机制?
- 类加载:把class字节码文件从硬盘中加载到内存,类加载器就是完成加载的工具
- 双亲委派:当一个类加载器收到一个类加载请求时,该类加载器首先会把请求委派给父类加载器,只有父类加载器在自己搜索范围内找不到指定类时,子类加载器才会自己来(从下往上找类是否加载,从上往下加载类)
- 用处:1.防止重复加载,每次加载都向上询问 2.保证核心类不被篡改,即使被篡改加载的类也不同
- 两个类来源于同一个 Class文件,被同一个Java虚拟机加载,只要加载它们的类加载器不同,那这两个类就必定不相等,基础类无论是被谁加载最终都会往上传递由指定的类加载器加载,保证了内存中基础类只存在一种,Object
- 描述 JVM 类加载过程
- 加载、验证、准备、解析、初始化
- String 对象主要存储在哪块区域
- 1.8后heap分成两块区域
- string是在heap的字符串常量池中,唯一存在
- string对象是heap另一区域,存储的是对象
- JVM运行时数据区
- 公用:方法区,堆
- 线程私有:虚拟机栈,本地方法栈,程序计数器
- JVM创建对象的过程/请描述 new 一个对象的流程
- 编译:.java – .class
- 加载:.class经过加载,会把类相关信息加载到JVM内存中
- 链接:对静态变量的值进行默认赋值
- 初始化:对静态变量进行真正的赋值;收集类静态代码块内容并执行
- 对象创建:~~~
- 深拷贝和浅拷贝
- 浅拷贝(shallowCopy)只是增加了一个指针指向已存在的内存地址,只复制对象空间而不复制资源
- 深拷贝(deepCopy)是增加了一个指针并且申请了一个新的内存,使这个增加的指针指向这个新的内存,新建了空间
- java数据类型:因为有值传递和引用传递(基础数据类型和引用类型),才从而出现的深浅拷贝
- 浅拷贝和对象拷贝:
- 浅拷贝得到是两个不同对象,两个对象中基础数据类型修改互不影响,引用类型是有影响的
- 对象拷贝没有生成新对象,两者对象地址一样,修改任何值都相互影响
- 深拷贝新建了空间,无相互影响,对于有多层对象的,每个对象都需要实现
Cloneable
并重写 clone()
方法,进而实现了对象的串行层层拷贝
- jvm中,直接内存是什么
- 在Java堆外,直接向系统申请的内存,使用NIO来分配和操作的内存区域,不受JVM管控
GC:
- JVM 中一次完整的GC流程是怎样的,对象如何晋升到老年代?
- 介绍下 GC 回收机制与分代回收策略
- GC 收集算法有哪些?它们的特点是什么?
- 如何判断一个对象是否被回收,有哪些 GC 算法,实际虚拟机使用最多的是什么 GC 算法?
- 描述 GC 机制。Class 会不会回收?用不到的 Class 怎么回收?
- 判断一个对象是否被回收
- 新生代和老年代用的垃圾回收策略,新生代和老年代都用什么算法
- 对 gc(垃圾回收)的理解
- 你觉得可达性分析用什么数据结构比较好(垃圾回收的延伸知识)
- 管理内存的策略和机制有哪些
- 如何判断堆中哪些对象需要被回收
Java:
- Java 中有几种引用关系,它们的区别是什么
- String,Stringbuffer,StringBuilder 的区别是什么?在进行字符串操作时的效率;String 在内存中是如何创建的?
- String 为什么是不可变的?String为什么设计成final的?
- final 、finally、finalize 区别
- 抽象类和接口的区别
- 重载和重写的区别
- 答:重写(两同、两小、一大),重载(方法名一致,形参列表不同)
- 什么是值传递和引用传递,Java 是值传递还是引用传递?
- String s = new String(“”);创建了几个对象?
- Java 里 equals和== 区别
- try-catch-finally,try 里有 return,finally 还执行么?
- Excption 与 Error 区别
- Static class 与 non static class 的区别
- 动态代理是什么?如何实现?动态代理的方法怎么初始化的?
- CGLIB 动态代理
- 说说反射的应用场景,哪些框架,原理是什么?
- Java 泛型的特点与优缺点,泛型擦除是怎么回事?
- 泛型 super 和 extends 的区别。a.说法 2:Java 的泛型,<? super T> 和 <? extends T> 的区别
- 为什么 IO 是耗时操作?为什么Java使用JNI调用C++方法,速度快?
- 内存泄露的场景
- final 关键字的作用,final 在多线程并发条件下的作用
- 面向对象的特点
- 继承时候可以去访问私有对象么
- java 语言中,不加任何限定符表示的是什么
- 接口不加限定词是什么状态,是包可见的么
- final 和 finally 的差别,finally 中一般会做什么事情
- java 在 1.7 或者 1.8 之后,还需要 finally 这个东西么,有没有其他的语法可以替代掉么,换个说法是:“1.8以后,try语句还有其他写法么?”
- 四种类型强制转换
- 数组和链表的区别
- static的静态方法能不能被继承
- final修饰不同类,方法,基本数据类型的区别,修饰string类以后会怎么样