java常识3

简介: 本内容介绍了JVM的组成及HashMap的工作原理。JVM包括类加载器、运行时数据区(堆、方法区、虚拟机栈等)、执行引擎和本地接口。HashMap基于数组+链表/红黑树实现,1.8中引入树化机制优化性能,扩容时采用位运算提升效率。同时对比了ConcurrentHashMap在不同版本中的实现差异。

jvm组成

1.类加载器:负责将java的.class文件转化为字节码文件,并加载到运行数据区的方法区

2.运行时数据区: jvm的内存

运行数据区的组成:

堆:存储实例化对象  伊甸园:s0,s1 8:1:1  老年代:新生代  新生代->老年代 条件:15次、大对象、动态担保机制

方法区:存储类信息,常量,静态变量,jdk8之后移动至元空间

虚拟机栈:线程独有,存储方法调用,局部常量,返回信息,由一个个的栈帧组成,(一次方法调用产生一个栈帧),只有一个活动栈帧

本地方法栈:处理本地方法的调用

程序计数器:记录当前线程执行的字节码位置

3.执行引擎:负责执行字节码文件

解释器,逐行解释执行字节码文件

及时解释器:配将频繁调用的的代码前端转化为本地机器码,提高效率

垃圾回收gc,回收堆中不使用的对象实例,释放内存

4.本地借口,

通过底层调用c或者c++的方法,实现与操作系统的交互

HashMap

数据结构:

1.7是数组+链表

1.8是数组+链表/红黑树

树化的时机:数组长度大于64且链表长度大于8

扩容机制:

扩容因子是0.75是根据泊松分布验证的合理值,

扩容因子:过大导致冲突上升,过小导致空间利用率过低

扩容为原来的两倍

数组长度要数组容量必须是2的幂次方原因:

HashMap 要求容量是 2 的幂次方,最终目的是用高效的位运算代替取模运算,同时保证元素在数组中分布更均匀,从而提升查询、插入、删除的效率。

执行流程:

put的执行流程:

首先把key进行两次hash计算得到hashcode,两次hash运算主要是为了减少hash碰撞,以及其分布的更均匀

再通过与数组长度的取模运算,得到要存储的数组下标

通过数组下表查找,如果对应位置为空则key-value的node节点存储进去,否则进行相同key的链表上的查找,如果key相同则替换value,不存在则存储在链表的末端,同时判断是否达到树化的时机,是否进行树化

CourrentHashMap的区别?

  • 1.7:分段锁,16个Segement对象
  • 1.8:CAS+synchronized
  • 低冲突用CAS
  • 高冲突使用synchronized
  • monitor
  • 线程id
  • 计数器

分布式锁

redission

zookeeper

文件夹的唯一性

etcd3

可重入锁

synchronized

reetrantLock

相关文章
|
4月前
|
消息中间件 存储 缓存
再次了解kafka
Kafka通过offset机制解决消息重复消费问题,支持手动提交偏移量及唯一ID去重。它保证分区内的消息顺序消费,结合集群、副本与重平衡实现高可用。高性能设计包括顺序读写、分区、页缓存、零拷贝等。数据清理依赖保留时间或大小策略,点对点和发布订阅模式则通过消费者组实现。
|
4月前
|
消息中间件 NoSQL Java
延时实现
本节介绍了多种关闭过期订单的实现方案,包括定时任务、JDK延迟队列、Redis过期监听、Redisson延迟队列、RocketMQ延迟消息及RabbitMQ死信队列。各自优缺点明显,适用于不同业务场景,如定时任务适合小数据量,RocketMQ适合高并发解耦场景,而Redisson则使用简单且高效。选择时需综合考虑系统复杂度、数据量及可靠性要求。
|
4月前
|
存储 缓存 Linux
CPU上下文切换的原理及其在系统调用和进程切换中的应用
本内容深入解析了CPU上下文切换的原理及其在系统调用和进程切换中的应用。详细说明了CPU寄存器、程序计数器在任务切换中的作用,以及系统调用与进程上下文切换的区别。同时探讨了上下文切换带来的性能开销,涉及TLB和虚拟内存管理机制,帮助理解操作系统如何高效调度进程。
|
4月前
|
Docker 容器
初始ollama
Ollama 按需加载模型,不持续运行,闲置时自动卸载,节省内存。模型响应请求时驻留内存,保留时间由 OLLAMA_KEEP_ALIVE 控制。类似 Docker 部署方式,但无单模型启停命令,默认时间内自动停止。可间接通过停止服务或配置多端口实现管理。
|
4月前
|
负载均衡 网络性能优化
了解EMQ
EMQ通过MQTT协议的QoS机制保障消息可靠传输,支持QoS 0、1、2三个等级,分别实现消息最多一次、至少一次和恰好一次传递。对于延迟消息,EMQ X支持通过特殊主题前缀`$delayed/{DelayInterval}`实现延迟发布。点对点通信可通过不带群组的共享订阅(如`$queue/t/1`)实现,结合负载均衡策略如随机、轮询等,确保消息仅由一个订阅者接收;发布订阅模式则通过带群组的共享订阅(如`$share/组名称/t/1`)实现,确保每组一个订阅者收取消息。
|
4月前
|
存储 算法 Sentinel
熔断降级
本内容介绍了微服务中熔断降级的实现原理及Sentinel的底层机制。通过OpenFeign集成Sentinel,利用断路器统计异常和慢请求比例,触发熔断并降级,提升系统稳定性。还讲解了Sentinel使用的限流算法,如滑动窗口、令牌桶和漏桶算法,以应对不同场景下的流量控制需求。
|
4月前
|
XML JSON Java
Spring框架中常见注解的使用规则与最佳实践
本文介绍了Spring框架中常见注解的使用规则与最佳实践,重点对比了URL参数与表单参数的区别,并详细说明了@RequestParam、@PathVariable、@RequestBody等注解的应用场景。同时通过表格和案例分析,帮助开发者正确选择参数绑定方式,避免常见误区,提升代码的可读性与安全性。
|
4月前
|
SQL Java 数据库连接
事务的七种传播行为及其应用场景
本文介绍了事务的七种传播行为及其应用场景,包括 PROPAGATION_REQUIRED、PROPAGATION_SUPPORTS、PROPAGATION_REQUIRES_NEW 等,帮助开发者理解事务管理机制。同时讲解了 Java 中 SQL 操作与对象数据不同步的问题,强调重新查询与手动管理的必要性,并说明 MyBatis 批量操作的最佳实践。
|
4月前
|
SQL JavaScript Java
三层架构理解(实现前后端分离)
本文介绍了三层架构实现前后端分离的流程,从前端Vue发起请求,到后端Spring处理数据,最后返回结果并由前端渲染展示。同时详细解析了Bean重复问题的解决方案,包括使用@Service、@Primary、@Qualifier和@Resource注解进行依赖注入控制。此外还介绍了MyBatis中#{}与${}的区别及使用场景,以及三层架构中各组件的协作方式。
|
9月前
|
存储 NoSQL 物联网
MongoDB应用场景
MongoDB应用场景