- 博客(47)
- 资源 (4)
- 收藏
- 关注
原创 JVM运行模式
JVM的运行模式由三种:解释模式(Interpreted Mode):只使用解释器(-Xint 强制JVM使用解释模式),执行一行JVM字节码就编译一行为机器码编译模式(Compiled Mode):只使用编译器(-Xcomp JVM使用编译模式),先将所有的JVM字节码一次编译为机器码,然后一次性执行所有机器码混合模式(Mixed Mode):(-Xmixed 设置JVM使用混合模式)依然使用解释模式执行代码,但是对于一些“热点”代码采取编译器模式执行,这些热点代码对应的机器码会被缓存起来,下次执
2020-06-01 19:49:36
744
原创 类加载机制
1. 类加载过程多个java文件经过编译打包成可运行的jar包,最终由java命令运行某个主类的main函数启动程序,这里首先需要通过类加载器把主类加载到JVM。主类在运行过程中如果使用到其他的类,会逐步去加载这些类1。从类加载到使用整个过程有如下几步加载 >> 验证 >> 准备 >> 解析 >> 初始化 >> 使用 >> 卸载加载:在硬盘上查找并通过IO读入字节码文件,使用到类时才加载,例如调用类的main方法,new对象
2020-05-27 22:04:57
266
原创 Java对象内存结构
对象内存结构分为三部分:对象头hash码,对象所属的年代,对象锁,锁状态标志,偏向锁(线程)ID,偏向时间,数组长度(数组对象)等对象实际数据即创建对象时,对象中成员变量,方法等对齐填充保证对象的大小是8字节的整数倍MataData元数据指针——指向当前对象的Class对象HotSpot虚拟机对象头MarkWord...
2020-04-06 21:02:30
222
原创 Java中实例对象存储在哪?
当实例对象存储在堆区时:实例对象存放在堆区,对实例的引用存在线程栈上,而实例的元数据存在方法区或者元空间。那么,实例对象一定是存放在堆区吗?答案是不一定,如果实例对象没有发生线程逃逸行为,就会被存储在线程栈中。这涉及到JIT在编译中对Java代码的优化——逃逸分析。逃逸分析的基本行为就是分析对象动态作用域。如果一个对象在方法中被定义,但是对象的使用仅是在当前方法中,而且对象本身比较简单,那么...
2020-04-06 19:15:42
2678
原创 单例模式——双检锁
对象创建过程申请内存空间 address = allocate实例化对象 instance填充数据到内存空间 address = instance无法保证上述的三步的原子性,也有可能产生指令重排(防止产生异常1,需要添加 volatile 关键字)public class LazySingleton { private static volatile LazyS...
2020-01-15 23:57:19
191
原创 并发编程——指令重排和内存屏障
一、指令重排什么是指令重排? java语言规范规定JVM线程内部维持顺序化语义。即只要程序的最终结果与 它顺序化情况的结果相等,那么指令的执行顺序可以与代码顺序不一致,此过程叫指令的重排序。指令重排发生阶段?执行器编译阶段CPU运行时指令重排的意义 适当的对机器指令进行重排序,使机器指令能更符合CPU的执行特性,最大限度的发挥机器性能。源码到最终执行的指令序列示...
2020-01-15 22:58:02
854
原创 并发编程——JMM(Java内存模型)
一、现代计算机理论模型与工作原理冯诺依曼计算机模型控制器(Control)运算器(Datapath)存储器(Memory)输入(Input system)输出(Output system)现代计算机主要结构基础CPU数据读取速度: 寄存器 > L1 > L2 > L3 > 内存 CPU缓存是为了弥补内存速度跟不上cpu处理数据速度而诞生的,当...
2020-01-15 21:16:26
211
原创 并发编程——volatile
volatile是Java虚拟机提供的轻量级的同步机制volatile语义有如下两个作用可见性:保证被volatile修饰的共享变量对所有线程总数可见的,也就是当一个线程修改了一个被volatile修饰共享变量的值,新值总是可以被其他线程立即得知。有序性:禁止指令重排序优化。volatile缓存可见性实现原理JMM内存交互层面:volatile修饰的变量的read、load...
2020-01-14 23:06:45
215
原创 ElasticSearch安装与环境配置
1. 下载安装包并解压安装包下载地址:https://elasticsearch.cn/download/这里我使用的6.6.0版本;使用wget命令或者下载到本地后复制到机器上,wget命令如下:wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.6.0.tar.gz解压安装包到自己想要放...
2019-12-29 21:44:42
231
原创 秀翻了——计算一个数是否是2的指数
private static boolean isPowerOfTwo(int val) { return (val & -val) == val;}负数的二进制表示是对应正数的二进制编码的补码例如:-3 的二进制编码3 的原码: 0000 00113 的反码: 1111 11003 的补码: 1111 1101补码就是反码加1...
2019-12-24 00:19:22
111
原创 最短路径——迪杰斯特拉 Dijkstra 算法
Dijkstra算法用于解决单源最短路径问题;是贪婪算法的最好的例子。在上述有向图中,要计算从点1到达其余各点的最短路径。其中两点之间的有向箭头表示从起点到终点的距离,例:0~2之间的箭头表示从0到2的距离为30,从2到0是不可达的。这里我们使用邻接矩阵data[][]来存储点到点之间的距离,data[3][4]表示3~4的路径,-1表示不可达;{{ 0, -1, 10, -1, 30, ...
2019-12-09 23:11:05
325
原创 图论入门篇
相关定义图 由顶点和边组成的结构顶点 图中的元素节点,如上图中的A,B,C等边(弧) 顶点之间的关系连线,如果边是有向(或者点对有序的),则图也会被叫做有向图。边的表示(A, B),同时也说明A,B邻接度 顶点邻接的顶点数目图的存储方式1.邻接矩阵对于上边的有向图,可以通过邻接矩阵的方式来表示:当图中顶点的度比较低时,我们说图是稀疏的,对应的矩阵也被称为稀疏矩阵2...
2019-12-04 00:11:05
654
1
原创 自定义BeanDefinitionRegistryPostProcessor
实现 BeanDefinitionRegistryPostProcessor 接口@Componentpublic class MyBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor { // 在所有bean定义信息将要被加载,bean实例还未创建的时候;优先于post...
2019-12-02 21:41:10
237
原创 在自定义BeanFactory的后置处理器中尚未示例化的bean定义进行修改
创建自定义BeanFactory的后置处理器并设置MyLog为懒加载/** * 在类的定义加载完但是没有初始化是对类定义做除修改 */@Componentpublic class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor { @Override public void postPro...
2019-12-02 21:20:03
185
原创 通过实现ApplicationListener接口创建监听器
实现ApplicationListener接口,覆写onApplicationEvent(ApplicationEvent event)方法@Componentpublic class MyApplicationListener implements ApplicationListener { @Override public void onApplicationEvent...
2019-12-02 21:09:16
410
原创 通过@Profile注解 来根据环境来激活标识不同的Bean
@Profile标识在类上,那么只有当前环境匹配,整个配置类才会生效@Profile标识在Bean上 ,那么只有当前环境的Bean才会被激活没有标志为@Profile的bean 不管在什么环境都可以被激活激活切换环境的方法通过运行时jvm参数来切换 -Dspring.profiles.active=test | dev | prod通过代码的方式来激活AnnotationConfi...
2019-11-30 15:58:27
370
原创 @AutoWired自动装配
1. @AutoWired的使用@Servicepublic class MyService { @Autowired private MyDao myDao;}1.1 自动装配首先时按照类型进行装配,若在IOC容器中发现了多个相同类型的组件,那么就按 属性名称来进行装配@Configuration@ComponentScan(value = {"com.dgr.an...
2019-11-28 00:30:50
292
原创 通过@Value +@PropertySource来给组件赋值
public class Person { @Value("董") private String firstName; @Value("#{28-10}") private int age; @Value("${person.lastName}") private String lastName; public Person() { ...
2019-11-27 23:44:03
342
原创 Bean的初始化方法和销毁方法
1. bean的生命周期bean的创建、初始化、销毁方法。由容器管理Bean的生命周期,我们可以通过自己指定bean的初始化方法和bean的销毁方法@Configurationpublic class MainConfig { @Bean(initMethod = "init", destroyMethod = "destroy") public Car car() { ...
2019-11-27 23:20:36
338
原创 往IOC容器中添加组件的方式
1. 通过@CompentScan + @Controller | @Service | @Respository | @compent 组合的方式针对我们自己写的组件可以通过该方式来进行加载到容器中2. 通过@Bean注解来导入组件(适用于导入第三方组件的类)3. 通过@Import注解来导入组件 (导入组件的id为全类名路径)14. 通过实现FacotryBean接口来注册组件2适合...
2019-11-26 23:41:15
232
原创 @Import注解
导入第三方组件通过@Import来导入组件(导入组件的id为全类名路径)@Configuration@Import({Person.class})public class MainConfig {}通过@Import 的ImportSeletor类实现组件的导入 (导入组件的id为全类名路径)public class MyImportSelector implements Impo...
2019-11-26 23:25:21
153
原创 @Conditional进行条件判断
有两个组件,MyLog 和 MyAspect,Mylog 需要依赖 MyAspect创建MyCondition类,实现Condition接口public class MyCondition implements Condition { @Override public boolean matches(ConditionContext context, AnnotatedType...
2019-11-26 22:58:25
679
原创 @Lazy注解
主要针对单实例的bean在容器启动的时候,不创建对象,在第一次使用的时候才会创建该对象@Bean@Lazypublic Person person() { return new Person();}
2019-11-26 22:43:01
150
原创 @Scope注解
用于配置Bean的作用域对象。1. 在不指定@Scope的情况下,所有的bean都是单实例的bean,而且是饿汉加载(容器启动实例就创建好了)@Beanpublic Person person() { return new Person();}2. 指定@Scope为 prototype 表示为多实例的,而且还是懒汉模式加载(IOC容器启动的时候,并不会创建对象,而是 在第一次...
2019-11-26 22:40:29
115
原创 @CompentScan注解
在配置类上添加@CompentScan注解来进行包扫描@ComponentScan(basePackages = {"com.dgr.annotation.component_scan"})public class MainConfig {}1. 排除用法 excludeFilters(排除@Controller注解的,和TulingService的)@ComponentScan(ba...
2019-11-26 22:26:04
382
原创 JAVA注解
@Inherited@Documented@Retention(RetentionPolicy.RUNTIME)@Target({ElementType.CONSTRUCTOR, ElementType.METHOD})public @interface SafeVarargs {}使用此注解声明出来的自定义注解,在使用此自定义注解时,如果注解在类上面时,子类会自动继承此注解;@S...
2019-11-26 22:16:05
94
原创 哈夫曼树(最优二叉树)
给定N个权值作为N个叶子节点,构造一个二叉树,带权路径长度总和最小,这样二叉树称做哈夫曼树,又称做最优二叉树。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。哈夫曼编码数据通信中,需要将传输的文字转为二进制的字符串,为了使编码后字符串尽可能端,在不等长编码中,可以让使用频率高的字符用短码,频率低的字符使用长码。为了使不等长编码为前缀编码(要求一个字符的编码不能是另一个字符的编码的前缀...
2019-11-25 00:39:14
1844
原创 红黑树
红黑树:一种自平衡二叉查找树。红黑树和AVL树1类似,都是在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能。红黑树的性质节点是红色或黑色;根节点是黑色;每个红色节点的两个子节点都是黑色(从每个叶子到根的所有路径上不能有两个连续的红色节点);从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点红黑树的操作颜色变换:红 -> 黑, 黑 -&...
2019-11-17 20:09:06
88
原创 二叉查找树
二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。在对二叉查找树进行中序遍历,会得到一个关键字的有序数列。下图所示就是一个二叉查找树:二叉查找树的查找...
2019-11-17 11:25:57
162
原创 MongoDB的索引特性
mongoDB中collections中会有默认索引 _id索引,单键索引# 在name属性上添加索引db.student.createIndex({name:1})# 查看查询学生名为 学生1 的执行计划db.student.find({name:"学生1"}).explain(){ "queryPlanner" : { "planne...
2019-11-14 22:41:43
191
原创 MongoDB的聚合操作
MongoDB的聚合操作分为两种:pipeline聚合mapReduce聚合mapReduce聚合:通过自定义的聚合命令,实现聚合操作,自由度高,适合大数据量且复杂的聚合操作pipeline聚合使用MongoDB提供的聚合命令,速度快,只能运行在单机上,适合小数据量的实时聚合操作,且在资源的使用上有一定的限制:单个聚合操作耗费的内存不能超过20%;返回的结果集大小小于16M1. 语...
2019-11-14 21:37:26
360
原创 MongoDB中$type和null类型
MongoDB中的数据类型如下图:插入数据:db.user.insert([{name:"张三", sex: "man"}, {name:"李四", sex:null}, {name:"王五"}])查询sex为null的用户:db.user.find({sex:null}){ "_id" : ObjectId("5dcc1a794552bedf4414fe77"), "name" :...
2019-11-13 23:08:14
545
原创 二叉树的层次遍历
树的相关定义:结点:树里的元素 父子关系:节点之间相连的边 子树:结点大于1时,其余的结点分为互不相交的集合 度:子节点的数量 叶子:度为0的结点 孩子:结点的子树的根二叉树:一种特殊的数据结构,每个结点至多只有两个子树;二叉树的第N层至多有个结点,树至多有个结点。满二叉树:每个存在子结点的结点都有两个子结点完全二叉树:除了最后一层外,其他层的结点树达到最大...
2019-11-12 23:13:45
182
原创 初识MongoDB
MongoDB的体系结构1. NoSql的概念NoSQL(NoSQL = Not Only SQL ),意即“不仅仅是 SQL ”,互联⽹的早期我们的数据 ⼤多以关系型数据库来存储的。其特点是规范的数据结构(预定义模式)、强⼀⾄性、表与表 之间通过外键进⾏关联,这些特征使我们对数据的管理更加清晰和严谨,但随着互联⽹的发展 数据成爆炸式的增⻓我们对数据库需要更好的灵活性和更快的速度。这就是NoS...
2019-11-11 22:50:46
263
原创 动态规划之简单背包问题
背景有三个物品,,它们的信息如下:物品物品1物品2物品3体积124价值61012现在有一个能够容量为5的背包,将上述三个物品任意放入背包中,要求放入背包的物品的总价值最大;思路将背包容量按照单位容量划分,依次计算放入物品时被背包中物品的总价值:背包容量12345物品166666物品26101...
2019-11-09 23:19:46
244
原创 Linux安装jdk
一、下载安装包选择适合自己系统的jdk版本或者使用wget命令下载:wget命令如下wget --user=orcale账号 --ask-password 下载链接我的orcale账号为295135885@qq.com,下载链接可以右键自己要下载的jdk文件,复制链接地址获得wget --user=295135885@qq.com --ask-password https://down...
2019-11-08 19:30:16
109
原创 java 序列化和反序列化
一、什么是序列化和反序列化序列化 把对象转换为字节序列的过程称为对象的序列化;反序列化 把字节序列恢复为对象的过程称为对象的反序列化;对于字节序的说明,我在Endian–计算机中字节、字的存储机制一文中做了简单介绍,百度百科中相对详细一点。网络传输中都是使用大端格式,不同的操作系统所使用的字节序是不同的。二、什么情况下需要序列化和反序列化对象要被保存到文件或者数据库使用套接字在网络上...
2019-10-30 23:25:57
113
Nacos源码流程——服务注册与发现.png
2020-04-02
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人