拉勾教育java开发工程师核心秘籍并发分布JVM详读
现在开放的创业环境,也是很多企业和程序员不断释放自己能力的一个过程,程序员创业、IT人才的创业,各种层出不叠的技术点,变化莫测的技术知识体系,如果掌握了几个重点知识体,能够快速的掌握java核心,
现在问理工科毕业生、程序员啥难?莫过于IT企业的java面试官,在过了各种艰难险阻之后,如何去适应各种技术类的java面试题,这里面为大家提供了java面试中常见的几个点,并发、分布、JVM,一百遍应万变,降低面试难度。
并发性能调优
1. 每秒钟5k个请求,查询手机号的笔试题,设计算法?请求再多,比如5w,如何设计整个系统?
缓存读取不会形成瓶颈,队列生产不会形成瓶颈,形成瓶颈的点有可能发生在外部运营商接口,因此我们会对实时查询服务做限流和熔断,所以不会压垮运营商,但是用户端的体验就糟些了,所以我们需要把缓存预热的功夫做足,改善体验。
2. 高并发情况下,我们系统是如何支撑大量的请求的?
尽量用缓存技术,同步转换异步,合并多个请求,代码进行优化,同时做好中间件处理。
分布式
1、存储方式 Memecache把数据全部存在内存之中,断电后会挂掉,数据不能超过内存大小。 Redis有部份存在硬盘上,redis可以持久化其数据
2、数据支持类型 memcached所有的值均是简单的字符串,redis作为其替代者,支持更为丰富的数据类型 ,提供list,set,zset,hash等数据结构的存储
3、使用底层模型不同 它们之间底层实现方式 以及与客户端之间通信的应用协议不一样。 Redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求。
4、value 值大小不同:Redis 大可以达到 1gb;memcache 只有 1mb。
5、redis的速度比memcached快很多
6、Redis支持数据的备份,即master-slave模式的数据备份。
JVM
1. 程序计数器(PC,Program Counter Register)。在 JVM 规范中,每个线程都有它自己的程序计数器,并且任何时间一个线程都只有一个方法在执行,也就是所谓的当前方法。程序计数器会存储当前线程正在执行的 Java 方法的 JVM 指令地址;或者,如果是在执行本地方法,则是未指定值(undefined)。(不会抛出OutOfMemoryError)
2. Java 虚拟机栈(Java Virtual Machine Stack),早期也叫 Java 栈。每个线程在创建时都会创建一个虚拟机栈,其内部保存一个个的栈帧(Stack Frame),对应着一次次的 Java 方法调用。
前面谈程序计数器时,提到了当前方法;同理,在一个时间点,对应的只会有一个活动的栈帧,通常叫作当前帧,方法所在的类叫作当前类。如果在该方法中调用了其他方法,对应的新的栈帧会被创建出来,成为新的当前帧,一直到它返回结果或者执行结束。JVM 直接对 Java 栈的操作只有两个,就是对栈帧的压栈和出栈。
栈帧中存储着局部变量表、操作数(operand)栈、动态链接、方法正常退出或者异常退出的定义等。
3. 堆(Heap),它是 Java 内存管理的核心区域,用来放置 Java 对象实例,几乎所有创建的 Java 对象实例都是被直接分配在堆上。堆被所有的线程共享,在虚拟机启动时,我们指定的“Xmx”之类参数就是用来指定大堆空间等指标。
( 编译器通过逃逸分析,确定对象是在栈上分配还是在堆上分配)
理所当然,堆也是垃圾收集器重点照顾的区域,所以堆内空间还会被不同的垃圾收集器进行进一步的细分,有名的就是新生代、老年代的划分。
4. 方法区(Method Area)。这也是所有线程共享的一块内存区域,用于存储所谓的元(Meta)数据,例如类结构信息,以及对应的运行时常量池、字段、方法代码等。
现在问理工科毕业生、程序员啥难?莫过于IT企业的java面试官,在过了各种艰难险阻之后,如何去适应各种技术类的java面试题,这里面为大家提供了java面试中常见的几个点,并发、分布、JVM,一百遍应万变,降低面试难度。
并发性能调优
1. 每秒钟5k个请求,查询手机号的笔试题,设计算法?请求再多,比如5w,如何设计整个系统?
缓存读取不会形成瓶颈,队列生产不会形成瓶颈,形成瓶颈的点有可能发生在外部运营商接口,因此我们会对实时查询服务做限流和熔断,所以不会压垮运营商,但是用户端的体验就糟些了,所以我们需要把缓存预热的功夫做足,改善体验。
2. 高并发情况下,我们系统是如何支撑大量的请求的?
尽量用缓存技术,同步转换异步,合并多个请求,代码进行优化,同时做好中间件处理。
分布式
1、存储方式 Memecache把数据全部存在内存之中,断电后会挂掉,数据不能超过内存大小。 Redis有部份存在硬盘上,redis可以持久化其数据
2、数据支持类型 memcached所有的值均是简单的字符串,redis作为其替代者,支持更为丰富的数据类型 ,提供list,set,zset,hash等数据结构的存储
3、使用底层模型不同 它们之间底层实现方式 以及与客户端之间通信的应用协议不一样。 Redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求。
4、value 值大小不同:Redis 大可以达到 1gb;memcache 只有 1mb。
5、redis的速度比memcached快很多
6、Redis支持数据的备份,即master-slave模式的数据备份。
JVM
1. 程序计数器(PC,Program Counter Register)。在 JVM 规范中,每个线程都有它自己的程序计数器,并且任何时间一个线程都只有一个方法在执行,也就是所谓的当前方法。程序计数器会存储当前线程正在执行的 Java 方法的 JVM 指令地址;或者,如果是在执行本地方法,则是未指定值(undefined)。(不会抛出OutOfMemoryError)
2. Java 虚拟机栈(Java Virtual Machine Stack),早期也叫 Java 栈。每个线程在创建时都会创建一个虚拟机栈,其内部保存一个个的栈帧(Stack Frame),对应着一次次的 Java 方法调用。
前面谈程序计数器时,提到了当前方法;同理,在一个时间点,对应的只会有一个活动的栈帧,通常叫作当前帧,方法所在的类叫作当前类。如果在该方法中调用了其他方法,对应的新的栈帧会被创建出来,成为新的当前帧,一直到它返回结果或者执行结束。JVM 直接对 Java 栈的操作只有两个,就是对栈帧的压栈和出栈。
栈帧中存储着局部变量表、操作数(operand)栈、动态链接、方法正常退出或者异常退出的定义等。
3. 堆(Heap),它是 Java 内存管理的核心区域,用来放置 Java 对象实例,几乎所有创建的 Java 对象实例都是被直接分配在堆上。堆被所有的线程共享,在虚拟机启动时,我们指定的“Xmx”之类参数就是用来指定大堆空间等指标。
( 编译器通过逃逸分析,确定对象是在栈上分配还是在堆上分配)
理所当然,堆也是垃圾收集器重点照顾的区域,所以堆内空间还会被不同的垃圾收集器进行进一步的细分,有名的就是新生代、老年代的划分。
4. 方法区(Method Area)。这也是所有线程共享的一块内存区域,用于存储所谓的元(Meta)数据,例如类结构信息,以及对应的运行时常量池、字段、方法代码等。