Java高级

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的键值都可以为nullHashtable的键值都不可以为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

监控:jpsjstat、jinfojmapjhatjstack

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服务治理方案。

猜你喜欢

转载自www.cnblogs.com/starsyh/p/9182098.html