1.Java中常量池
以表的形式存在(表是用来存储字符串值的,不存储符号引用),实际可以分两种,一种为静态常量池,另一种为运行时常量池,共有11种常量表,常量池的每一个常量都代表一张表。
常用的三种常量池:全局字符串常量池、class文件常量池、运行时常量池。
- 全局常量池在每个VM中只有一份,存放的是key(字面量“abc”)-value(字符串"abc"实例对象在堆中的引用)键值对。
- class常量池是class字节码文件里的内容,在编译阶段,存放的是与类相关的常量。
- 运行时常量池是运行时的内容,每个class都有一个运行时常量池,类在解析之后,将符号引用替换成直接引用,与全局常量池中的引用值保持一致。
2.JVM内存情况(常考)
JVM = 类加载器(classloader) + 执行引擎(execution engine) + 运行时数据区域(runtime data area)
运行时数据区域包括:堆、程序计数器、方法区、虚拟机栈、本地方法栈。
本地机栈(Native Method Stacks): - 线程私有的。
- 本地方法栈则是为虚拟机使用到的Native 方法服务。
虚拟机栈(JVM Stacks):
- 线程私有的,他的生命周期和线程相同。
- 为虚拟机执行Java方法服务。
- 可能存在StackOverflowError和OutOfMemoryError异常。
程序计数器(Program Counter Register):
- 线程私有,他的生命周期和线程相同。
- 程序计数器中存储的数据所占空间的大小不会随程序的执行而发生改变,所以此区域不会出现OutOfMemoryError的情况。
方法区(Method Area):
-
线程共享,存储类加载信息、常量、静态变量等。
-
运行时常量池是方法区的一部分,Class 文件中的常量池会在类加载后被放入这个区域。
堆(Heap): -
线程共享,在虚拟机创建时,用来存放实例的对象,生命周期与虚拟机相同。使用-xms指定内存。
-
GC垃圾回收主要处理的区域。Java堆中可以细分为:新生代和老年代。
3.GC是什么?为什么要有GC? -
GC是垃圾回收的意思,垃圾回收的目的是识别并且丢弃应用不再使用的对象来释放和重用资源。
-
忘记或错误的内存回收会导致程序或系统的不稳定甚至奔溃。
-
GC的三种方式:串行回收、并行回收、混合回收
4.垃圾回收器的基本原理是什么?如何主动通知虚拟机进行垃圾回收?回收机制有什么? -
当程序员创建对象时,GC就开始监控这个对象的地址、大小以及使用情况。GC采用有向图的方式纪录和管理堆中的所有对象。通过这种方式确定哪些对象是"可达的",哪些对象是“不可达的”。当GC确定一些对象为“不可达”时,GC就有责任回收这些内存空间。
1.按时间轮询,把没有引用的对象进行回收
2.按内存的使用量超不超过报警值进行回收
3.按CPU空闲时间进行回收
4.程序建议JVM进行垃圾回收 -
程序员可以手动执行system.gc()通知GC运行,但不一定执行。
-
回收机制有分代复制垃圾回收和标记垃圾回收,增量垃圾回收。
5.Java垃圾回收的三种算法(北京的软件公司多问) -
标记清除法,分为两步(标记和清除)
-
标记阶段:遍历所有的对象,在活动的对象头打上活动的标记
-
清除阶段:再次遍历对象,检查对象头,对于没有活动标记的对象,将其内存空间释放;对于有活动标记的对象,去掉标记
-
引用计数法
-
为每一个对象引入一个计数器,对于任意一个对象,每有一次对这个对象的引用,就将计数器加1;结束对这个对象的引用,再将计数器减1;一旦计数器归0,则表示这个对象可以被清除。
-
复制算法,将内存分为两部分(From区和To区)
-
第一步,此阶段和标记清除法的第一步相同,在From区标记所有活动的对象
-
第二步, 把这些活动的对象复制到To区,再将原来的From区全部清空,并交换两区内存指责。(即一个GC后原来的From区会变为To区,To区变为From区)
6.什么时Java分布式应用
一个大型的系统往往被分为几个子系统来做,一个子系统可以部署在一台机器的多个jvm上,也可以部署在多台机器上。但是每一个系统不是独立的,不是完全独立的。需要相互通信,共同实现业务功能。
7.为什么分布式一定用到redis
分布式使用redis主要考虑到两点:性能和并发。 -
性能:在碰到需要执行耗时特别久,且结果不频繁变动的 SQL时,使用redis缓存可以使请求迅速响应。
-
并发:在大并发的情况下,所有请求直接访问数据库会导致数据库连接异常,在此时适合使用redis
8.redis常用基本数据类型(常考) -
五种基本数据类型:
字符串类型(String)
散列类型(hash)
列表类型(list)
集合类型(Set)
有序集合类型(zset)
9.Java中跳出循环的方法(常考,特别是大公司) -
break:跳出当前循环;但是如果是嵌套循环,则只能跳出当前的这一层循环,只有逐层break才能跳出所有循环
-
continue:终止当前循环,但是不跳出循环(在循环中continue后面的语句是不会执行了),继续往下根据循环条件执行循环。
-
return:从当前的方法中退出,返回到该调用的方法的语句处,继续执行。 若返回的使一个值,返回值的数据类型必须与方法的声明中的返回值的类型一致;若return后面不带参数(即返回空),其实主要目的就是用于想中断函数执行,返回调用函数处。
特别注意:返回值为void的方法,从某个判断中跳出,必须用return;
10.Sting和Stringbuffer和Stringbuilder的区别(常考)
- 运行速度上:Stringbuilder > Stringbuffer > String
- 线程安全上:Stringbuilder 是线程不安全的,而Stringbuffer 是线程安全的
- String:适合用于少量的字符串操作的情况
- Stringbuilder :适合用于单线程下在字符串缓冲区进行大量操作的情况
- Stringbuffer :适合多线程下的字符串缓冲区进行大量操作的情况