第5章 Java程序设计基本概念
- JVM使用哪种字符表示? Unicode characters。
在Java中字符只以一种形式存在,就是Unicode。
- 什么时候用assert?
可以在预计正常情况下不会到达的任何位置上放置断言。
断言可以用于验证传递给 私有 方法的参数。(不管是否启用断言,公有方法都会检查其参数
利用断言测试后置条件。(公有/非公有
断言不应该以任何方式改变程序的状态。
- 哪一个main函数的声明是不合法的? D
A. public static void main()
B. public static void main(String[] string)
C. public static void main(String[] exp) throws FileNot FoundException
D. static void main(String[] args)
main方法必须是public的,默认的是protect。
- 谈谈final、finally、finalize的区别。
1)final修饰符(关键字): 一个类被声明为final,不可被修改,不可被继承,只能被使用,不能被重写;
一个类不可以既被声明为abstract,又被声明为final(抽象类总是希望被继承的)。
2)finally:在异常处理时提供finally块来执行任何清除操作。如果抛出一个异常,那么相匹配的catch子句就会执行,然后控制就会进入finally块(如果有的话)
3)finalize:是方法名。使用finalize方法在垃圾收集器将对对象从内存中清除出去之前做必要的清理工作;
在Object类中定义,所有的类都有finalize方法。
finalize方法是在垃圾收集器删除对象之前对这个对象调用的。(只能被调用一次 - 什么是Reflection(反射)?其他语言有这种特点吗?
反射:指程序可以访问、检测和修改它本身的状态或行为的一种能力。
它能够创建灵活的代码,这些代码可以在运行时装配,无须在组件之间进行链接;
允许在编写与执行时,使程序代码能够接入装载到JVM中的类的内部信息,而不是源代码中选定的类协作的代码(这使反射成为构建灵活应用的主要工作)
Java特有。
第6章 传递与引用
- Java中传值还是传引用?
基本类型变量:传值
对象型变量:传引用 - 如何实现Java的序列化?
参考:https://www.cnblogs.com/yangchunze/p/6728086.html
第7章 循环、条件、概率(编程题
第8章 Java内存管理
-
Java中的垃圾收集器相对于以前的语言的优势是什么?
无须程序员显式地分配内存、释放内存。(显式容易引起“内存泄漏”
Java在创建对象时会自动分配内存,并当该对象的引用不存在时释放这块内存。
垃圾收集器是自动运行的,程序运行时,垃圾收集器会不时检查对象的各个引用,并回收无引用对象所占用的内存。
调用System类中的静态gc方法可以运行垃圾收集器,但这样并不能保证立即回收指定对象。 -
Java是如何管理内存的?
Java的内存管理就是对象的分配和释放问题:
分配:通过关键字new为每个对象申请内存空间(基本类型除外),所有对象都在 堆 中分配空间。
释放:内存的释放是由GC完成的。GC为了能够正确释放对象,必须监控每个对象的运行状态,包括对象的申请、引用、被引用、赋值等。 -
什么是Java中的内存泄漏?
- 对象是可达的。
- 对象是无用的。
满足这两个条件就可以判定为Java中的内存泄漏。这些对象不会被GC回收,却占用内存。
-
内存泄漏主要由什么引起?都有什么样的情况?
主要原因:保留永不再使用对象的引用。
典型的内存泄漏及其原因如下:
1)全局集合:在大的应用程序中有某种全局的数据储存库是很常见的。必须注意管理储存库的大小,需要有某种机制从储存库中移除不再需要的数据。- 周期性运行的某种清除任务
- 使用反向链接计数(为0时将该元素从集合中移除
2)缓存:缓存是一种数据结构,用于快速查找已经执行的操作结果。
缓存通常以动态方式实现,程序必须确保对于缓存所使用的内存容量有一个上限。- 移除缓存最久结果
- 使用java.lang.ref.SoftReference类跟踪缓存中的对象。
3)ClassLoader: 不仅涉及“常规”的对象引用,还涉及元对象引用,比如字段、方法和类。
因为ClassLoader本身可以关联许多类及其静态字段,所以就有许多内存被泄漏。 -
如何确定泄漏的位置?
发生内存泄漏的第一迹象:在应用程序出现OutOfMemoryError。
1⃣️发生在生产环境中。几乎不能调试,需要使用一些开销较低的工具来监控和查找内存泄漏,要求无须重启系统或修改代码将这些工具连接到正在运行的系统上。
2⃣️可能是因为应用程序确实正在使用这么多的内存。增加JVM可用的堆的数量,或者更改应用程序使它使用较少的内存。
内存泄漏查明方法:不间断的监控GC的活动,确定内存使用量是否随时间增加,如果是,就可能发生了内存泄漏。