Java疑难杂问③

本文探讨了Java领域的常见负载均衡策略,包括轮询、加权轮询、hash算法、随机算法和最小连接数等,以及各种策略的适用场景和优缺点。同时讲解了堆外内存的管理,JVM的Client和Server模式的区别,以及private、public、protected访问权限的解释。还涉及了Netty的应用,Spring解决循环依赖的机制,以及Long对象和String对象计算hashcode的方法。最后讨论了JVM堆栈与OS堆栈的关系,多线程崩溃的影响,硬中断和软中断的区别,以及磁盘空间问题。

常见负载均衡策略

标题轮询(Round Robin)
  轮询的实现方式比较简单,就是将请求以此分发到后端服务器中,将所有的请求均匀分配,均匀分配的坏处是通常后台服务器性能有差异,有时候希望性能较好的服务器可以多承担些请求,该策略无法满足需求。这个不适合对长连接和命中率有要求的场景。

加强轮询(Weighted Round Robin)
  这种策略是对轮询策略的优化,对每个后端服务器设置一个权重值,根据权重值决定请求的分配比例,这种做法解决了轮询策略的不足,但是该权限值需要手动配置,没有办法自动动态调节,同样不适合对长连接和命中率有要求的场景。

hash算法
  通过ip url等信息计算hash值,然后对服务器的数量取模,相同的请求会请求到同一个后端服务器中。该算法无法解决热点请求,会把某个时间段的热点请求路由到某个单机上,造成雪崩效应,同时在扩中和节点宕机时发生命中率急剧降低的问题(hash算法导致),该策略适合维护长连接和提高命中率。

随机Random
  根据随机算法,将请求随机分配到后端服务器中,请求的均匀请求依赖于随机算法,该实现方式较为简单,常常可以配合处理一些极端的请求,例如热点请求情况。不适合对命中率有要求的场景。

一致性hash算法
  对hash 算法的优化,可以有效的解决宕机和扩充造成的命中率急剧降低的问题。

最小连接数 Least Connection
  通过活动来估计后端服务器的负载,把请求分配给活动连接数最小的后端服务器,算法比较智能,但是需要额外的资源维护后端服务器的连接列表。

加权最小连接数 Weighted Least Connection
  对Least Connection策略的优化,通过加权的方式优化Least Connection的性能,对性能较好的后端服务器设置较高的权重,承担更多的链接负载。

最短响应时间 Least Response Time
  该策略的意思就是将请求分配给平均响应时间最短的后端服务器,平均时间可以通过ping或者正常的响应时间来获取 。

堆外内存

  堆外内存可以通过Unsafe和NIO包下的ByteBuffer来操作堆外内存。堆外内存会溢出,并且其垃圾回收依赖于代码显式调用System.gc()。JVM在堆内只保存堆外内存的引用,用DirectByteBuffer对象来表示。每个DirectByteBuffer对象在初始化时,都会创建一个对应的Cleaner对象。这个Cleaner对象会在合适的时候执行unsafe.freeMemory(address),从而回收这块堆外内存。当DirectByteBuffer对象在某次Young GC中被回收,只有Cleaner对象知道堆外内存的地址。当下一次Full GC执行时,Cleaner对象会将自身Cleaner链表上删除,并触发clean方法清理堆外内存。此时,堆外内存将被回收,Cleaner对象也将在下次Young GC时被回收。如果JVM一直没有执行Full GC的话,无法触发Cleaner对象执行clean方法,从而堆外内存也一直得不到释放。使用堆外内存可以减少GC的压力,对于Spark来说,能精准控制内存大小。

对象在堆外也需要序列化
在这里插入图片描述
堆内对象写入磁盘需要四次拷贝,堆外使用mmMAP零拷贝,需要两次拷贝

JVM client模式和Server模式的区别

  最主要的差别在于:-Server模式启动时,速度较慢,但是一旦运行起来后,性能将会有很大的提升。原因是:当虚拟机运行在-client模式的时候,使用的是一个代号为C1的轻量级编译器,而-server模式启动的虚拟机采用相对重量级,代号为C2的编译器。C2比C1编译器编译的相对彻底,服务起来之后,性能更高。

private public protected

  public:具有最大的访问权限,可以访问任何一个在classpath下的类、接口、异常等。它往往用于对外的情况,也就是对象或类对外的一种接口的形式。
  protected:主要的作用就是用来保护子类的。它的含义在于子类可以用它修饰的成员,其他的不可以,它相当于传递给子类的一种继承的东西。
  default:有时候也称为friendly,它是针对本包访问而设计的,任何处于本包下的类、接口、异常等,都可以相互访问,即使是父类没有用protected修饰的成员也可以。
  private:访问权限仅限于类的内部,是一种封装的体现,例如,大多数成员变量都是修饰符为private的,它们不希望被其他任何外部的类访问。

Netty应用场景

  阿里分布式服务框架 Dubbo 的 RPC 框架使用 Dubbo 协议进行节点间通信,Dubbo 协议默认使用 Netty 作为基础通信组件,用于实现各进程节点之间的内部通信。其中,服务提供者和服务消费者之间,服务提供者、服务消费者和性能统计节点之间使用 Netty 进行异步/同步通信。除了 Dubbo 之外,淘宝的消息中间件 RocketMQ 的消息生产者和消息消费者之间,也采用 Netty 进行高性能、异步通信。

大数据领域
  Hadoop 的高性能通信和序列化组件 Avro 的 RPC 框架,默认采用 Netty 进行跨节点通信,它的 Netty Service 基于 Netty 框架二次封装实现。大数据计算往往采用多个计算节点和一个/N个汇总节点进行分布式部署,各节点之间存在海量的数据交换。由于 Netty 的综合性能是目前各个成熟 NIO 框架中最高的,因此,往往会被选中用作大数据各节点间的通信。

Spring 如何解决循环依赖的问题

三级缓存
https://w.cnblogs.com/nullllun/p/9154133.html
https://blog.youkuaiyun.com/w1014074794/article/details/88406330
https://zhuanlan.zhihu.com/p/84267654
https://www.cnblogs.com/xiaoxing/p/10762686.html#link-1

Long String对象怎么计算hashcode

  Long 64 位 int 34 位,而 hash值是 int 类型,因此需要将 64位转化为小于等于32位。Long 的 hash 值是通过将前半段和后半段异或得到的。让高位和低位都能够参与到 hash 运算中,让结果离散。
  String类的hash code的值为val[0]*31^(n-1) + val[1]*31^(n-2) + … + val[n-1],其中val是字符串对应的char数组。所以字符串内容一样的String对象,调用hashCode()返回的值也是一样的。但反过来,返回的hashCode()一样时,其字符串内容不一定一样,因为上面的方法计算hashCode时可能会发生位数溢出。

JVM堆栈和os堆栈有什么关系?

  这两个不是一个东西,JVM的堆栈是跑在OS堆栈上的,因为进程跑在OS堆栈上,进程在OS堆栈上有分配空间。OS的堆栈在虚拟内存上,堆和栈在OS里是两片空间,这两片空间是指虚拟内存的空间。Java的堆栈是JVM划分出来的东西,JVM在申请空间的时候要去OS的文件映射区去申请空间的。然后JVM定义申请的空间的含义,OS不管它怎么定义。

多线程下一个线程崩溃了为什么会导致其他线程都崩溃

  一个线程OOM之后,这个时候线程会被Kill掉,然后抛出OutOfMemory异常信息。因为栈上的空间是线程私有的,所以线程被Kill掉之后,栈上的空间就被释放了,但是堆空间是共享的,被Kill掉的线程中的对象可能被该线程之外的其他线程引用,这个时候这部分对象就没有办法被GC掉,其他线程如果此时需要申请资源但是又资源又不足,那么此时其他线程就不能运行。

硬中断 软中断

1、软中断是执行中断指令产生的,而硬中断是由外设引发的。
2、硬中断的中断号是由中断控制器提供的,软中断的中断号由指令直接指出,无需使用中断控制器。
3、硬中断是可屏蔽的,软中断不可屏蔽。
4、硬中断处理程序要确保它能快速地完成任务,这样程序执行时才不会等待较长时间,称为上半部。
5、软中断处理硬中断未完成的工作,是一种推后执行的机制,属于下半部。

磁盘空间还有10个G,但是现在写数据却写不进去了,这可能是因为什么?

  文件数据都储存在“块”中,每一个文件都有对应的inode储存元数据,inode也会消耗硬盘空间,所以硬盘格式化的时候,操作系统自动将硬盘分成两个区域。一个是数据区,存放文件数据;另一个是inode区(inode table),存放inode所包含的信息。每个inode节点的大小,一般是128字节或256字节。inode节点的总数,在格式化时就给定,一般是每1KB或每2KB就设置一个inode。由于每个文件都必须有一个inode,因此有可能发生inode已经用光,但是硬盘还未存满的情况。这时,就无法在硬盘上创建新文件。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值