HashMap简介
HashMap 是一个散列表,它存储的内容是键值对(key-value)映射。
HashMap 继承于AbstractMap,实现了Map、Cloneable、java.io.Serializable接口。
HashMap 的实现不是同步的,这意味着它不是线程安全的,但可以用 Collections的synchronizedMap方法使HashMap具有线程安全的能力。它的key、value都可以为null。此外,HashMap中的映射不是有序的。
HashMap 的实例有两个参数影响其性能:“初始容量” 和 “加载因子”。初始容量默认是16。默认加载因子是 0.75, 这是在时间和空间成本上寻求一种折衷。加载因子过高虽然减少了空间开销,但同时也增加了查询成本.
HashMap是数组+链表+红黑树(JDK1.8增加了红黑树部分)实现的,当链表长度太长(默认超过8)时,链表就转换为红黑树.
jvm 原理 程序运行区域划分
Java运行时数据区域?
包括程序计数器、JVM栈、本地方法栈、方法区、堆
方法区里存放什么?
本地方法栈:和jvm栈所发挥的作用类似,区别是jvm栈为jvm执行java方法(字节码)服务,而本地方法栈为jvm使用的native方法服务。
JVM栈:局部变量表、操作数栈、动态链接、方法出口。
方法区:用于存储已被虚拟机加载的类信息,常量、静态变量、即时编译器编译后的代码等。
堆:存放对象实例。
Full GC触发条件:
(1)调用System.gc时,系统建议执行Full GC,但是不必然执行
(2)老年代空间不足
(3)方法去空间不足
concurrentMap 和 HashMap 区别
1.hashMap可以有null的键,concurrentMap不可以有
2.hashMap是线程不安全的,在多线程的时候需要Collections.synchronizedMap(hashMap),ConcurrentMap使用了重入锁保证线程安全。
3.在删除元素时候,两者的算法不一样。
ConcurrentHashMap和Hashtable主要区别就是围绕着锁的粒度以及如何锁,可以简单理解成把一个大的HashTable分解成多个,形成了锁分离。
类加载机制是怎样的
JVM中类的装载是由ClassLoader和它的子类来实现的,Java ClassLoader是一个重要的Java运行时系统组件。它负责在运行时查找和装入类文件的类。
类加载的五个过程:加载、验证、准备、解析、初始化。
分布式 CAP 了解吗?
一致性(Consistency)
可用性(Availability)
分区容忍性(Partition tolerance)
线程池用过吗?
线程池(Thread Pool)对于限制应用程序中同一时刻运行的线程数很有用。因为每启动一个新线程都会有相应的性能开销,每个线程都需要给栈分配一些内存等等。
我们可以把并发执行的任务传递给一个线程池,来替代为每个并发执行的任务都启动一个新的线程。只要池里有空闲的线程,任务就会分配给一个线程执行。在线程池的内部,任务被插入一个阻塞队列(Blocking Queue ),线程池里的线程会去取这个队列里的任务。当一个新任务插入队列时,一个空闲线程就会成功的从队列中取出任务并且执行它。
LinkedHashMap
LinkedHashMap是通过哈希表和链表实现的,它通过维护一个链表来保证对哈希表迭代时的有序性,而这个有序是指键值对插入的顺序。
RPC的详细过程
RPC主要的重点有:
动态代理,主要是invoke反射原理
序列化,使用Thrift的效率高
通信方式,使用Netty的NIO能提高效率
服务发现,使用zookeeper可以实现
Eureka遵守AP zookeeper
ACID 原子性 一致性 独立性 持久性
CAP 强一致性 可用性 分区容错
Zookeeper保证CP
Eureka则是AP
HashMap和Hashtable的区别
HashMap是非线程安全的,Hashtable是线程安全的。
HashMap的键值都可以为null,Hashtable的键值都不可以为null值。
HashMap继承自AbstractMap类,Hashtable继承自Dictionary类。
ps : Properties类继承自Hashtable类。
JVM虚拟机
GC算法有哪些
引用计数
复制
标记-清除
标记-压缩
分代(新生代、老年代、永久代)
垃圾回收器有哪些
串行回收器:新生代串行回收器、老年代串行回收器
并行回收器:新生代ParNew回收器、新生代ParallelGC回收器、老年代ParallelGC回收器
CMS回收器:(Concurrent Mark Sweep、并发标记清除)
G1回收器(1.7以后代替CMS回收器)
如何调优JVM
标准参数:
-client -server模式
-Xmn、-Xms、-Xmx
监控:jps、jstat、jinfo、jmap、jhat、jstack…
Java 中堆和栈有什么区别?
JVM 中堆和栈属于不同的内存区域,使用目的也不同。
栈常用于保存方法帧和局部变量,而对象总是在堆上分配。
栈通常都比堆小,也不会在多个线程之间共享,而堆被整个 JVM 的所有线程共享。
缓存和NoSQL
Memcache与Redis的区别
memcache把数据存在内存之中,断电后会挂掉;Redis部分数据持久化在硬盘上,断电不会丢失。
memcache存的是key-value对,redis支持更多的数据结构和数据类型
memcache可以使用一致性hash做分布式,redis可以做主从同步
redis单线程,只使用1个cpu
如何实现Redis的分片
使用一致性哈希对数据进行映射
实现方式:客户端分片(每个客户端对应一个分片)、代理协助分片、查询路由分片;
使用redis集群,如codis(豌豆荚,依赖zookeeper);
分布式
zookeeper的用途
zookeeper作为分布式应用协调系统,已经用到很多分布式项目中。
可以用来完成统一命名服务、状态同步服务、集群管理、分布式应用配置项等管理工作。
zookeeper的主要操作分一下几种:
创建节点
读取节点数据
更新节点数据
删除节点
监控节点变化
应用场景:
统一命名服务,使用create自动创建节点编号;
配置管理,多个节点的共享配置,当配置发生变化时,可利用zookeeper让使用这些配置的节点获得通知,进行重新加载等操作。如dubbo服务。
集群管理:集群选举主节点,资源定位。
共享锁
负载均衡
应用项目:
dubbo服务集群、redis集群、Hadoop集群等
dubbo的用途以及优点
Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。
转载于:https://my.oschina.net/u/2441327/blog/1830099