1. 请说明JVM内存模型,JVM内存分为哪几个区?如何处理内存泄漏问题
2. 简述JVM原理
JVM是程序和操作系统之间的虚拟处理器,通过软件来实现计算机基于操作系统与硬件,能让java程序运行,JVM可以加载和执行编译器产生的.class文件,就可以让任意的程序看作成.class对象,.class对象通过JVM可以在任意的操作系统上运行。
3. 描述一下JVM加载class文件的原理机制?
装载
加载二进制文件(.class文件)
链接
验证--验证.class文件是否是从编译器产生的,防止安全问题
解析--加载静态信息并赋予默认系统初始值
准备--把符号引用(大部分是常量以及静态信息)转为直接引用
初始化
就是静态信息的直接赋值
4. Java中垃圾回收有什么目的?什么时候进行垃圾回收?
减少无用对象占用内存,提高堆内存的使用率,不用程序员考虑内存回收的问题
堆内存使用率超过了一定的限制(默认0.7可以改动),在CPU空闲的时候
5. 什么是字节码?采用字节码的最大好处是什么?什么是Java虚拟机?
字节码---低配的语言,可以在JVM上进行运行,屏蔽底层系统的不同
传输快、可以在不同的操作系统上进行运行
JVM就是通过软件实现的虚拟计算机,可以在不同的操作系统上运行java程序,JVM把内存区域进行了抽象,像C、C++含有哪些设备,很多规范
6. Java堆的结构是什么样子的?什么是堆中的永久代(Perm Gen space)?
从存储数据(物理)静态常量池(静态区)、运行时常量池
从GC(逻辑)新生代(伊甸园去、幸存区(from、to))、老生代、永久代
永久代:永久从存储的信息(class、元数据),这个区域不回收的,内存一直增加就会容易产生内存溢出,jdk1.8就干掉了这个区域
7. 什么是已检查异常?什么是未检查异常?吧编程时,catch异常后,应该怎么处理
已检查异常:编译时异常---编译时出错,一定需要处理,抛出、捕获
未检查异常:运行时异常---编译时期没错,运行时期出错,可以处理也可以不处理
1. 打印日志 2. 包装成父类对象进行全局检测 3. 跳转错误页面
8. 数组和链表有什么区别,如何选择,如何实现栈和队列
数组适合增删改
链表适合读取数据
9. 如何读取一个大文件如4GB文件
双向流---setSeek()---确定断电的位置 缓存
10. 用最有效率的方法算出2乘以17等于多少?
2*17(16+1) 2*2左移4位或1
11. 10亿条短信,找出前一万条重复率高的
12. 请问你在什么情况下会在你的JAVA代码中使用可序列化?
pojo类进行读写
网络间的传输
13. 为什么放到HttpSession中的对象必须要是可序列化的
14. 举出一个例子,在这种情况你会更倾向于使用抽象类,而不是接口?
抽象类---约束、规范、方法可重复,所有子类对于父类都需要共同的方法提供
15. 在Java中设计一个并发规则的pipeline?
16. 在Java中定义一个不做事且没有参数的构造方法的作用
私有化的构造方法----(枚举 enum 枚举常量在其他位置可以使用)Math、Arraus、Collections、System(工具类 )
17. Java序列化的底层原理?
18. Java中的内存溢出是如何造成的?
19. import java和javax有什么区别
20. java中异常机制
21. try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?
会执行,在return前执行。
22. 内部类可以引用他包含类的成员吗?有没有什么限制?
23. 为什么在重写了equals()方法之后也必须重写hashCode()方法?
24. sleep()和wait()有什么区别?
25. 请阐述一下你对JAVA多线程中“锁”的概念的理解。
26. 所有的递归实现都可以用循环的方式实现,请描述一下这两种实现方式各自的优劣。
并举例明在什么情况下可以使用递归,而在什么情况下只能使用循环而不能使用递归?