1、JVM结构:类加载器子系统、运行时数据区(内存空间)、执行引擎以及与本地方法接口等组成。其中运行时数据区又由方法区、堆、Java栈、PC寄存器、本地方法栈组成。内存空间中方法区和堆是所有Java线程共享的,而Java栈、本地方法栈、PC寄存器则由每个线程私有。
2、Java栈:由栈帧组成,一个帧对应一个方法调用。调用方法时压入栈帧,方法返回时弹出栈帧并抛弃。Java栈的主要任务是存储方法参数、局部变量、中间运算结果。,并且提供部分其它模块工作需要的数据。在Sun JDK中,本地方法栈和Java栈是同一个。
3、方法区:类型信息和类的静态变量都存储在方法区中。方法区中对于每个类存储了以下数据:类及其父类的全限定名(java.lang.Object没有父类)、类的类型(Class or Interface)、访问修饰符(public, abstract, final)、实现的接口的全限定名的列表、.常量池、字段信息、方法信息、静态变量、ClassLoader引用、Class引用,大概所有关于类的信息都存储在这里了。在Sun JDK中,方法区对应了持久代(Permanent Generation),默认最小值为16MB,最大值为64MB。
4、堆用于存储对象实例以及数组值。运行时java栈局部变量如果是new出来的,java栈其实存储的是堆的地址。gc的主要区域。
参考GC回收的文章
5、JAVA常用集合整理:
1、数组:数组可以存放Object和基本数据类型,但创建时必须指定数组的大小,并不能再改变。值得注意的是:当数组中的某一元素存放的是Object reference 时,Java不会调用默认的构造函数,而是将其初值设为null,当然这跟Java对各类型数据赋默认值的规则是一样的,对基本数据类型同样适用。
2、ArrayList:实现了List接口,没有同步机制,线程不安全,底层为数组实现,但ArrayList大小随意,自己会动态增长大小,每次增加当前一半的大小。随机查询效率比较高。ArrayList在随机插入的时候需要移动大量的其他节点的元素。
3、LinkedList,跟ArrayList差不多,但是底层实现为链表,插入节点只需修改一个节点的信息,随机插入删除效率比较高。随机查询需要遍历整个链表
4、Vector:对比于数组,当更多的元素被加入进来以至超出其容量时,Vector的size会动态增长,而数组容量是定死的。同时,Vector在删除一些元素后,其所有下标大于被删除元素的元素都依次前移,并获得新下标比原来的小了。注意:当调用Vector的size()方法时,返回Vector中实际元素的个数。Vector内部实际是以数组实现的,也通过元素的整数索引来访问元素,但它只能存放java.lang.Object对象,不能用于存放基本类型数据,比如要存放一个整数10,得用new Integer(10)构造出一个Integer包装类对象再放进去。当Vector中的元素个数发生变化时, 其内部的Array必须重新分配并进行拷贝,因此这是一点值得考虑的效率问题。Vetor同时也实现了List接口,所以也可以算作Colletion了,只是它还特殊在:Vector is synchronized。即Vetor对象自身实现了同步机制。
5、HashMap:继承了Map接口,实现用Keys来存储和访问Values,Keys和Values都可以为空,Hashtable类的Keys不能为null,底层实现为数组加链表,jdk1.8里,链表元素大于8就会将链表转化为红黑二叉树。HashMap采用链表法解决hash散列冲突,HashMap类没有强制线程同步,线程不安全,Hashtable类有同步机制控制。但是现在不用HashTable。
6、ConcurrentHashMap:HashMap的升级版,多用于多线程HashMap的使用场景,底层实现为16个桶,每个桶存储一个hashTable。多线程的时候插入元素只要锁住一个桶即可,不需要锁住整个对象。默认提升效率16倍。
6、ExecutorService线程池:
newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。
newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
底层实现还是ThreadPoolExecutor。
7、高并发解决方案:HTML静态化、图片服务器分离、缓存、负载均衡、CDN加速技术
8、SpringMVC运行原理
客户端请求提交到DispatcherServlet
由DispatcherServlet控制器查询一个或多个HandlerMapping,找到处理请求的Controller
DispatcherServlet将请求提交到Controller
Controller调用业务逻辑处理后,返回ModelAndView
9、switch 是否能作用在byte 上,是否能作用在long 上,是否能作用在String上?
答:在Java 5以前,switch(expr)中,expr只能是byte、short、char、int。从Java 5开始,Java中引入了枚举类型,expr也可以是enum类型,从Java 7开始,expr还可以是字符串(String),但是长整型(long)在目前所有的版本中都是不可以的。
10、List、Set、Map 都可以通过Iterator进行遍历,这里仅仅是通过List举例,在使用其他集合遍历时进行增删操作都需要留意是否会触发ConcurrentModificationException异常,多线程在读的时候集合发生大小变化也会报这个异常