自己对JVM的理解
内存模型线程独占:
虚拟机栈:先进后出的 又称方法栈,线程执行方法都是创建一个栈帧,用来存储局部变量表(存放局部变量的),操作数栈(后进先出的操作数栈。负责写入数据和提取数据),动态链接(执行常量池中的方法引用),方法出口等信息,JVM对栈的操作有2种,出栈和入栈。方法调用就是入栈。方法返回就是出栈
本地方法栈:区别是虚拟机栈为执行Java方法服务,而本地方法栈则为Native方法服务 什么是native方法呢 就是非Java方法。与Java环境外交互。因为JVM一些底层是C写的。比如Thread类中的setPrioruty方法
HotspotJVM中 将本地栈和虚拟机栈合二为一的 栈是运行时单位 堆是存储的单位
程序计数器:一块较小的内存空间,是当前线程所执行的字节码的行号指令器,每条线程都要有一个独立的程序计数器,这类内存也被称为线程私有的内存。用来记录程序执行到哪一个地方,下次可以在这个地方继续执行
线程共享:
堆:java虚拟机内存最大的一块,被所有线程共享,几乎所有线程实例都在这里分配内存。
1.7包含新生代、老年代、永久代
1.8只有新生代和老年代(永久代被删 ...
一台mac的开发环境配置
最近买了一台M1的mac,心水的mac终于到手了,先折腾一阵子,打算写个笔记记录一下。整体分为踩坑点、注意点、和一些常用的小Tips…本文持续更新!!!
一些小Tips:
软件如果打不开,提示xxx已损坏,要移到废纸篓
终端输入sudo spctl --master-disable
还不行则使用xattr -cr /Application/程序.app
例如qq打不开 xattr -cr /Application/QQ.app
最新系统更新到了14.2版本发现,还不行的话去设置里的隐私与安全性,拉到最下面,看下是不是被拦截了,允许就可以打开了
使用Vim编辑完成保存退出失败,强制保存也失败
很多命令包括复制权限一样,需要在命令前加上sudo使用管理员权限
mac安装软件很简单,要么去appstore,要么下载安装包,以dmg为后缀的,直接把程序拖到Application,听到叮的一声就完成了
自带的vim编辑器太丑了?
进入用户目录 cd ~
创建vim配置文件 sudo vim .vimrc
将下面三行写入文件保存,torte是你想保存的主题
123>set nu ...
基于ollama从零部署大语言模型
前言环境介绍:使用的Python版本为3.12.4且需要科学上网,对电脑性能有一定需求(但也没那么离谱)
相信不少人已经体验过Ai带来的便利了,甚至在工作上使用Ai加以辅助。本文是对那些对Ai产生兴趣且希望在自己的设备上实际运行大语言模型的人而准备,希望可以通过这篇文章来让更多人认识和了解Ai。本文是基于ollama创建和部署大语言模型,下面就开始进入正文。
ollama是什么?ollama是一个管理大语言模型的工具,帮助我们在本地快速创建、部署、使用大语言模型。它本身并不是一个大语言模型!还有一个名词llama,它跟ollama很像,但是区别可就大了。llama是由Meta开发的大语言模型,所以我们可以使用ollama加载llama这样的大语言模型。
安装ollama进入ollama官网,点击下载按钮,安装到自己电脑上即可。安装完成后可以使用ollama -v测试是否安装成功
使用ollama运行llama3.2模型我们先简单启动一个模型进行测试,我们以Meta最新的llama3.2的1b模型为例,执行下面命令可以自动安装并启动llama3.2模型。
1ollama run lla ...
个人对设计模式的理解与实践(持续缓更)
设计模式设计模式是什么?设计模式是我们对问题所提出的解决方案,就像一个个蓝图,通过对问题的一些综合考虑,采用最合适的设计方案来解决问题。就像一个工具箱,我们要看具体的情况,来决定使用哪把工具。那么设计模式是如何诞生的呢,设计模式最开始也是一个解决方案,只不过这个方案在各种项目中得到了验证。最终得到认可,是前辈们一个个试验,一步一个坑踩过来,最终被后人们整理,收纳,所归类的出的一种新领域
设计模式的优点
提高我们的思维能力和设计能力
使程序的设计变得标准化、流程化,增强开发效率
对代码来说,提高了可读性和复用性以及可扩展性
设计模式的六大原则
单一职责: 一个类应该只有一个会引起它变化的原因,也就是一个类只负责一个职责
开闭原则: 对扩展开放,对修改关闭
里氏代换原则: 子类应该可以替换父类对象,并保持逻辑不变
依赖倒转原则: 抽象不依赖细节,细节依赖于抽象。也就是对接口编程,不要直接使用实现类
接口隔离原则: 不应该强迫一个类实现它不需要的方法,而是使用多个精细化的接口
迪米特法则: 一个实体类尽量少与其他实体类有相互作用
设计模式的分类创建型模式:通过提供创建对象的机制,增加已 ...
Java21虚拟线程的研究与使用
认识虚拟线程在Java21中正式引入了虚拟线程,它与我们目前所使用的传统线程(也叫平台线程)有什么区别,本文针对虚拟线程来进行研究并实战一些案例,帮助大家理解。
虚拟线程是在Java19中初次出现并在Java21中正式推出。与平台线程相比,它具有以下优势:
轻量化:虚拟线程是一个轻量化的线程,由JVM管理,所以创建和销毁的开销都很小,可以轻松创建上百万个线程。平台线程则是由系统内核直接管理,一个平台线程对应一个系统内核,自然创建和销毁的开销成本会比较高
无阻塞影响:在平台线程中,如果遇到阻塞时会阻塞操作系统对应的线程,导致降低系统的并发的能力。在虚拟线程中,如果遇到阻塞时并不会真正阻塞操作系统的线程,而是会自动挂起并释放资源,保证系统线程的可用性
资源管理:因为虚拟线程轻量化的原因,所以永远不应该池化,每个任务都会创建一个新的虚拟线程,使用完成后销毁。而平台线程则因为重量级,所以必须进行池化来进行资源复用
调度效率:因为虚拟线程是JVM管理的,所以可以快速切换上下文,而平台线程是由系统内核管理,需要更多的上下文切换时间
综上所述,虚拟线程十分适合处理高并发、I/O密集查询等场 ...
gRPC框架的学习和使用
前言RPC在了解gRPC之前,我们需要先知道RPC,也就是远程过程调用(Remote Procedure Call),它本身并非是一种协议,而是一种调用方式,允许一台机器调用另一台机器上服务的方法,而且屏蔽了底层网络通信的细节,并且支持跨语言调用。目前常见的RPC框架有gRPC、Thrift、Dubbo等。
gRPCgRPC是由Google开发的现代高性能远程过程调用框架。使用HTTP/2作为传输协议,使用Protocol Buffers(protobufs)作为接口定义语言。也是本文要进行认识学习的一个东西
下面是一张gRPC的简单工作图:基于c++编写的服务端,以及与之通信的Ruby和Java客户端。不同的语言通过编译器插件将proto文件生成对应的代码即可使用。
RPC与HTTP的对比
传输协议: HTTP使用HTTP/1.1或HTTP/2,而gRPC严格使用HTTP/2。这意味着gRPC可以利用HTTP/2的多路复用、头部压缩和二进制帧等特性,提供更高效的通信。
多路复用:在HTTP2,多个请求及响应可以在一个TCP ...
Docker Compose的理解与多场景应用
前言上一期我们简单介绍了Dockerfile及对应使用方法,本地项目打包成镜像并上传到docker仓库。那么本期继续对Docker进行深入,了解Docker Compose多容器编排的处理。
本文使用的为docker compose v2,版本为v2.28.1,v1已经停止维护了(docker compose的版本为2.x.x就是v2,v1的命令使用-连接的,如v1:docker-compose up v2:docker compose up)。
Docker Compose简单认识Docker Compose 用于定义和运行多容器 Docker 应用的工具,通过一个 docker-compose.yml 文件来配置应用服务,简化了多容器环境的管理。很多复杂的项目往往需要各种各样的中间件,在以前我们需要手动一个一个配置,而现在,我们只需要执行别人写好的docker-compose文件即可完成各种组件和环境的引入。
安装Docker Composemac&windowsmac与windows的Docker Compose包含在Docker桌面端,直接安装桌面端Docker即可。
...
本地项目打包成镜像并上传到docker仓库
前言在平时编写代码时,我们可以在本地跑通的项目有时候在别人那里就是出现各种莫名其妙的错误,从而产生了“调试环境”的时间,而解决环境问题所需要的时间也说不定,轻则几分钟,重则以天计单位。但这个时候如果让别人直接用我们“现成”的环境就可以直接解决。这个就是Docker镜像的作用之一,但别人要用我们的镜像,我们就需要先把自己的镜像经过打包、构建、发布等一系列操作才行。
Dockerfile编写规则首先我们来看一下编写Dockerfile的各种命令
123456789101112131415161718192021222324252627# 设置基础镜像FROM openjdk:17-oracle# 添加元数据到镜像LABEL author="Sora33"# 设置环境变量ENV APP_HOME /app# 创建应用目录RUN mkdir $APP_HOME# 设置工作目录WORKDIR $APP_HOME# 复制文件到镜像COPY ./target/xxx.jar $APP_HOME# 安装依赖RUN apt-get update && apt-get ...
多服务器Kubernetes集群的部署
环境介绍
服务器及系统版本:2台阿里云服务器,Cenos7.8版本
Kubernetes版本:最新版(截止本文时间24年4月1日,最新版为1.29.3)
服务器配置:4核8G
Docker版本:最新版(截止本文时间24年4月1日,最新版为26.0.0)
cri-dockerd版本:最新版(截止本文时间24年4月1日,最新版为0.3.12)
网络插件Calico版本:最新版(截止本文时间24年4月1日,最新版为3.27.2)
前置准备
2台或以上阿里云服务器,配置至少为4核8G
因为需要从GitHub上下载东西,需要可以下载东西的网络
教程内出现的所有命令,如未特殊标注则默认是在每台机器上都要执行!!!
本文会从机器基础配置、基础插件安装、docker及其cri-dockerd、Kubernetes以及最后的可视化kuboard的安装,循序渐进,并且会在每一步进行对应的解析,来更好的帮助理解
机器基础配置1. 集群机器互通首先我们需要确保集群内的网络互通,我们需要从机器内选择一个做为master节点,其余的则是work工作节点,将master机器的名称改为master,其余的改为wo ...
【从零开始的K8s-02】ingress-nginx的认识与使用
认识Ingress-nginx我们先来看一下官网对于ingress的解释:
Ingress提供从集群外部到集群内服务的 HTTP 和 HTTPS 路由。流量路由由 Ingress 资源所定义的规则来控制。下面是 Ingress 的一个简单示例,可将所有流量都发送到同一 Service:
通俗的理解,我们可以将ingress理解为cloud项目里的网关,通过判断请求信息、请求路径后,转发到对应的服务内。
常见的ingress控制器有ingress-nginx、Traefik、HAProxy Ingress等等,但使用最多的还是nginx,本文也会以ingress-nginx来做演示
PS:ingress-nginx 是kubernetes社区维护的,而kubernetes-ingress 是nginx官方维护的,本文使用前者!
minikube安装Ingress-nginx控制器运行下面的命令进行安装
1kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/st ...