avatar
文章
75
标签
62
分类
23

主页
标签
分类
链接
关于笔者
玲辰书斋
搜索
主页
标签
分类
链接
关于笔者

玲辰书斋

类加载机制
发表于2022-11-25|JVM
概述 虚拟机是如何加载Class文件的? Class文件进入虚拟机后会有什么变化? ​ 在Java中我们知道有编译期和运行期,其中编译期为我们写的java代码通过javac编译成一个一个的class文件,而运行期则为将class文件通过jvm加载到内存中,通过一些列操作变成可以jvm直接使用的Java类型。这为Java带来了极高的扩展性和灵活性,例如动态链接和到动态加载,具体下来可用面向接口编程和一系列设计模式进行举例。 类的加载时机​ 一个类型从加载到jvm内存中开始,到卸载出内存为止,整个生命周期经历了: ​ 其中加载,验证,准备,初始化是按部就班的开始的,解析则不一定,一些情况中解析是在初始化后的,而这也是为了支持java的运行时绑定特性。 ​ 一般类的加载在《java虚拟机规范》中并没有强制要求,根据具体的虚拟机实现完成,而类的初始化则严格按照规定,有且只有六中情况,必须对类进行初始化,而前面的步骤自然也要提前完成。 遇到new,getstatic,putstatic,invokestatic 这四条字节码指令时,如 ...
后端编译与优化
发表于2022-11-25|JVM
后端编译与优化编译器优化技术逃逸分析 逃逸分析本身不是直接进行优化的方法,而是一种为优化提供帮助的分析算法 逃逸分析的原理: ​ 我们分析对象的动态作用域,如果对象创建在方法中,可能被外部方法所引用到,例如作为参数被外部方法进行调用,这叫做方法逃逸, ​ 被外部线程所访问到,例如赋值给外部线程使用的变量中。称为线程逃逸 ​ 从不逃逸,方法逃逸,线程逃逸。称为对象从小到大的逃逸程度,我们因此也可以做不同的优化策略、 栈上分配​ 大家都知道在java中,所有的对象都存储在堆空间中,随着存放 的对象越来越多,也就需要垃圾回收器来进行工作,而这一步也是非常消耗性能的,那这里就引出一个概念栈上分配,也就是当我们进行逃逸分析后,发现对象不存在线程逃逸,我们将对象存储在栈上,随着栈帧的插入与弹出,对象本身也跟着创建和销毁。 这里我们需要提醒两点: 之前放在堆中,堆中对象是被各个线程共享的,只要有指针指向该对象的地址,就可以进行使用。但栈是线程独有的。所以栈上分配的第一点:对象不会被线程共享,也叫做线程逃逸。 如果对象被分配到栈上了,随 ...
Redis挖矿分析
发表于2022-11-25|Redis
为什么当你学习Redis,发现自己的服务器在挖矿了​ 在我学习Redis时,因为嫌麻烦就没有设置密码,结果导致一段时间后系统提醒我,我的服务器上有挖矿行为,如果不清理就停止运行,我一脸懵逼,并不断上网查找哪里出现问题了,但最终还是没有解决,无奈下我初始化了服务器。希望本篇文章能对你有锁帮助,顺利让你体会到入侵自己服务器的感觉。 你是如何连接服务器的?​ 在最初我们购买好自己的服务器后,要么在服务器厂商页面进行安全连接,要么通过SSH 用户名@密码方式进行连接,例如下图: ​ 但到后面我们发现每次都需要输入密码,也太麻烦了,可以利用秘钥登陆服务器。那如何获取到你的秘钥呢? 客户端通过命令行模式输入:ssh-keygen生成自己的公钥和私钥(这里可以指定参数,具体自己查)。 手动将客户端的公钥放入远程服务器的指定位置,/root/.ssh/authorized_keys。 现在我们再通过ssh进行登陆,可以看到直接登陆到服务器了 那说了这么多,我们发现只要服务器上有你的秘钥,你就可以直接进行登陆,不需要设置密码。那这和Redis有啥关系呢? 你是如何连接 ...
Spring如何解决循环依赖
发表于2022-11-25|Spring
Spring循环依如何解决? 循环依赖是什么? class A{ B b; } class B{ A a; } //简单来说就是A的创建依赖于B,B的创建依赖于A。 在一般场景下,如何解决循环依赖的问题? 我们知道对象的创建一般有: ​ 无参构造器+属性Set方法初始化对象 ​ 有参构造器直接初始化对象 //通过有参构造器初始化 class A{ B b; public A(B b) { this.b = b; } } class B{ A a; public B(A a) { this.a = a; } } class client{ //我们发现会无限套娃下去,有参构造器方法不能使用 new A(new B(new A(new B()))) } //通过无参参构造器初始化 class A{ B b; public void setB(B b) & ...
封装自己的SDK
发表于2022-11-25|Spring
封装自己的SDK​ 我们在开发Spring项目时常常会引入各种xxx-spring-boot-starter的依赖包,然后在配置文件中填入必要的信息,就可以使用依赖提供好的容器。这里是在鱼皮新项目直播中学习到的,特此记录一下。可在未来封装自己的SDK进行封装与装逼。 SDK项目下 将pom.xml中的标签删除 <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <excludes> <exclude> <groupId>o ...
拦截器与过滤器的区别
发表于2022-11-25|Web
拦截器与过滤器的区别 底层思想是什么? 拦截器与过滤器都是基于AOP面向切面编程的思想来实现的。 两者有什么相同,有什么不同? 相同点:都可以对请求做出统一的处理,例如在方法调用前进行一些操作,在方法调后后处理一些操作 不同点: 拦截器是Spring提供的(org.springframework.web.servlet.HandlerInterceptor),而过滤器是Servlet提供的(java.servlet.*) 触发时机不同,过滤器在请求到达Servlet前被拦截开始执行,拦截器在到达Controller前被拦截开始执行 实现不同,过滤器基于方法回调实现,而拦截器是基于动态代理(底层反射)实现 支持的项目不同,过滤器只能在Web项目中用,拦截器可以在Swing,Application中都能用 使用场景不同,因为拦截器更接近业务系统,所以拦截器主要用来实现项目中的业务判断的,比如:登录判断、权限判断、日志记录等业务。而过滤器通常是用来实现通用功能过滤的,比如:敏感词过滤、字符集编码设置、响应数据压缩等功能。 为什么使用他们? ​ 在我们的日常业务中,我们 ...
分布式事务
发表于2022-11-25|分布式
简介​ 我们在过去总是使用本地事务,也就是数据库提供的事务操作,其中具有ACID的特性,但在如今我们的各个模块儿被拆分,服务与服务间相互调用,简单来说就是需要跨进程的事务,我们来想一下现有的本地事务是否能解决分布式事务。情况1:跨JVM,跨数据库产生分布式事务 graph TD; 用户下订单-->订单模块; 订单模块-->物流模块; 订单模块-->订单表; 物流模块-->物流表; 用户直接调用订单模块儿,开启事务,然后在订单表中存入数据,然后再远程调用物流模块儿,去操作物流模块儿,我们可以想到如果物流模块儿出现问题,订单模块儿远程调用发生错误,是会进行事务回滚的。应该是没问题的。那如果物流模块儿确实修改成功了,但网络传输出现了问题,订单模块儿就进行回滚了,则就导致了物流模块儿有数据,订单模块儿没数据的问题。我们再考虑下面的问题: 情况二:跨数据库实例产生分布式事务 graph TD; 人员管理模块儿-->用户数据库; 人员管理模块儿-->订单数据库; 前置理论 CAP理论​ CAP表示一致性 ...
后端演化过程
发表于2022-11-25|演化过程系列
后端风云​ 本文简单概况了一下刘欣老师的《码农翻身》的后端风云章,这本书强烈推荐给大家,每看一遍都有不同的感觉,通俗易懂且知识面大而全。居家旅行,必备良药!!! 早期初级阶段: ​ 在我们早期学习 javaWeb阶段,将订单模块儿,购物车模块儿,支付模块儿都写在了一个项目中,并访问一个Mysql数据库,这在自己练手项目中是没问题的,但如果系统上线,有大量的用户同时访问该系统,Tomcat服务器首先需要考虑能不能支撑住大的并发量(默认150,当超过250时,就应该考虑的服务器的集群),其次是Mysql数据库,在高并发两三千也就差不多了,要知道Mysql数据库读取数据是很慢的操作,它本质是从硬盘中读取文件的。 优化点1:使用缓存 可以看到我们给中间加了一个Redis中间件作为缓存,现在服务器需要获取数据,先到缓存中找数据,如果找不到再去Mysql中找数据,找到数据后再写回Redis中,这样下次请求数据可以直接在缓存中获取数据,那缓存的好处是啥,缓存是加载在内存中的,读取数据那肯定是快的多。这样就减轻Mysql数据库的压力。但是如果用户每次请求先去缓存找,如果都没 ...
并发编程
发表于2022-11-25|并发
基础的概念什么是并发操作?利用多核CPU去完成任务,类似于使用影分身去完成不同的作业,这肯定比我一个人一个个写要快的多 什么时候可以使用并发?当有多核CPU时。如果只有一个CPU,那并发实际上只是线程的不断切换,好比我在数学作业上先写点儿,再到语文上再写点儿,因为处理的很快,给人的感觉是同时操作的。但实际上只会比原来更慢(因为有线程切换的损耗)。 如何使用并发编程?public class BasicLearn { public static void main(String[] args) { new Thread(new A()).start(); new Thread(new FutureTask<String>(new B())).start(); new C().start(); } } // 无返回值 class A implements Runnable { @Override public void run() {} ...
Mysql的事务与索引
发表于2022-11-25|数据库
Mysql事务与索引 ​ 需求:先从数据库中读取一个字段的值,然后修改该字段,由于操作不是原子性,无法保证线程安全,也就是当A线程读取值为1时,想在原有基础上+1,赋值为2。而B线程已经将数据修改为2了,那么A线程应该是在2的基础上+1,赋值为3。但实际中可能该值都到8了,A又给人家改回2了。所以我们该如何解决数据安全问题? 本能想到利用JVM层面的锁机制,保证每次只有一个线程进行操作,但这个性能太差,而且JVM锁无法在分布式中生效。 利用数据库事务操作,下文我们主要讲Mysql事务的知识。 数据库事务​ 在讲事务之前,我们需要明确Mysql中只有Inndb存储引擎支持事务,如果是其他存储引擎则无法使用事务,所以我们应先检查自己的存储引擎是否正确。 查看数据库支持的存储引擎:show engines 查看自己的表使用的引擎:show table status from 数据库名 where name = '表名'; 修改表的存储引擎:ALTER TABLE 表名 ENGINE=引擎名称; 查看是否是自动提交:show variables like & ...
1…678
avatar
庚辰
要么读书,要么旅行,身体和心灵总有一个要在路上.
文章
75
标签
62
分类
23
Follow Me
最新文章
利用 Delegated Types 与 Self Joins 设计高扩展性系统
利用 Delegated Types 与 Self Joins 设计高扩展性系统2026-01-05
kamal 部署加速
kamal 部署加速2026-01-01
Vue 组件间通信方案:实现 Drawer 单例模式
Vue 组件间通信方案:实现 Drawer 单例模式2025-10-09
Rails层级设计演化
Rails层级设计演化2025-07-09
警惕AI
警惕AI2025-04-06
分类
  • JVM5
  • Java4
  • LSP1
  • Linux2
  • Redis2
  • Ruby10
  • Spring4
  • Turbo-Rails11
标签
AI AQS锁 Filter IOC IO流 Interceptor JavaScript LSP Mysql OOP Promis RMI RPC Rails Ruby SDK SQL Servlet Shell SpringMVC SublimeText Vue Zed electron jdbc kamal mysql opencv orm rails ruby ruby,rails rubyGem turbo 事务 二叉树 位运算 元编程 内存分配 内存溢出
归档
  • 一月 20262
  • 十月 20251
  • 七月 20251
  • 四月 20251
  • 二月 20251
  • 一月 20251
  • 十二月 20242
  • 十月 20241
网站资讯
文章数目 :
75
本站访客数 :
本站总访问量 :
最后更新时间 :
©2020 - 2026 By 庚辰
框架 Hexo|主题 Butterfly
陕ICP备2022014054号
搜索
数据库加载中