java
small&snail
蜗牛爬行的痕迹,是我积累的脚步
展开
-
记一次使用MAT线上排查OutOfMemory:metaspace
2、复现内存溢出或者通过gc日志分析,当复现后,dump日志就生成在了指定的目录下面。一次上线后,通过日志发现有outOfmemory:metaSpace的异常日志。5、谷歌下载MAT工具(是单独的软件不依赖eclipse)6、点击leak suspects查看内存泄漏分析。3、下载dump文件和日志文件在本地。6、通过MAT工具加载dump文件。原创 2023-02-20 16:00:14 · 1254 阅读 · 1 评论 -
redis的hash tag在业务开发中的应用
redis的hash tag在业务开发中的应原创 2022-10-28 11:46:52 · 459 阅读 · 0 评论 -
记一次使用Arthas排查:线上服务每次发版部署时,cpu飙高
问题定位参考文章:【死磕JVM】用Arthas排查JVM内存 真爽!我从小用到大_牧小农的博客-CSDN博客_arthas 分析内存1、遇到的问题每次发版部署服务,线上服务器的cpu飙高超过100%2、排查思路找到一次服务发版的时候,利用公司提供的线上故障排查工具,其实是阿里开源的Arthas进行排查原因: C2 Compiler线程 占用大量cpu 热点方法会使用C2编译Jdk8 默认开启分层编译0:解释代码1:简单C1编译代码...原创 2022-03-22 19:46:21 · 685 阅读 · 0 评论 -
算法---栈的最小值
实现一个这样的栈,这个栈除了可以进行普通的push、pop操作以外,还可以进行getMin的操作,getMin方法被调用后,会返回当前栈的最小值。栈里面存放的都是 int 整数,并且数值的范围是 [-100000, 100000]。要求所有操作的时间复杂度是 O(1)。附加:如果空间复杂度也能O(1)的话可加分。一、时间 O(1) + 空间 O(n)这个要求其实也不难,我们可以用一个辅助栈来存放最小值。例如我们有两个栈 stack 和 helper,stack 是目标栈,helper 是辅助栈,用来存原创 2021-06-27 22:41:58 · 957 阅读 · 0 评论 -
算法-- 反转部分单向链表
给定一个单向链表的头节点head,以及两个整数from和to,在单向链表上把第from个节点到第to个节点这一部分进行反转。例如:1->2->3->4->5->null,from=2,to=4调整结果为:1->4->3->2->5->nullpublic class NodePartReverse { private static class Node { int val; Node next; public Node(int val) {原创 2021-06-27 21:36:27 · 209 阅读 · 0 评论 -
工作中使用 RSA+AES,数字签名和加解密总结
一、总结:私钥签名,公钥解签;公钥加密,私钥解密二、流程图三、RSA加解密代码:https://blog.csdn.net/huyuyang6688/article/details/799668711、加密、解密流程2、实现(1)RSA加密工具类 RSACrypt.javapackage club.easyshare.framework.utils;import java.security.InvalidKeyException;import java.securit.原创 2021-06-15 20:39:25 · 2644 阅读 · 2 评论 -
一道SQL面试题
* 文章表:article * id,read_num,user_id,content * 1,232,2,abc * 2,22,2,eee * 3,12,1,dfdf * 4,44,1,dfe* 问题:查找 每个作者阅读数最高的 文章id集合select id from article t1 join (select user_id,max(read_num) from article group by user_id) t2 on(t1.user_id=...原创 2021-04-09 23:30:41 · 120 阅读 · 0 评论 -
Kafka/RocketMQ 多线程消费时如何保证消费顺序
RocketMQ是用了两把锁:1)向 Broker 端请求锁定当前顺序消费的队列,防止在消费过程中被分配给其它消费者处理从而打乱消费顺序。2)RocketMQ 会为每个消息队列建一个对象锁,这样只要线程池中有该消息队列在处理,则需等待处理完才能进行下一次消费,保证在当前 Consumer 内,同一队列的消息进行串行消费。Kafkakafka 的消费类 KafkaConsumer 是非线程安全的,因此用户无法在多线程中共享一个 KafkaConsumer 实例,且 KafkaConsum.原创 2021-03-31 21:06:54 · 1218 阅读 · 0 评论 -
给定一个二叉树,返回所有从根结点到叶子节点的路径
给定一个二叉树,返回所有从根结点到叶子节点的路径。public class AllNodePath{private static class TreeNode{ int val; TreeNode left; TreeNode right; public TreeNode(int val){ this.val=val; }}public static void main(String[] args){ TreeNode root =...原创 2021-02-15 13:09:05 · 756 阅读 · 0 评论 -
为什么java main主线程退出了子线程还能运行;golang main结束所有协程都被结束了
最近看golang main函数结束,所有协程都被结束了结论是这样:A不是main程的情况下,在A程里开启B程,A程执行完,A程return之后,B程不受影响,不会挂掉。所有子协程与main程同级的,与main程伴生java主线程结束和子线程结束之间的关系Main线程是个非守护线程,不能设置成守护线程。这是因为,main线程是由java虚拟机在启动的时候创建的。main方法开始执行的时候,主线程已经创建好并在运行了。对于运行中的线程,调用Thread.setDaemon()会抛出异常Exc原创 2021-01-14 10:09:02 · 2239 阅读 · 1 评论 -
程序员必知之浮点数运算原理详解
导读:浮点数运算是一个非常有技术含量的话题,不太容易掌握。许多程序员都不清楚使用==操作符比较float/double类型的话到底出现什么问题。 许多人使用float/double进行货币计算时经常会犯错。这篇文章是这一系列中的精华,所有的软件开发人员都应该读一下。 随着你经验的增长,你肯定 想去深入了解一些常见的东西的细节,浮点数运算就是其中之一。1. 什么是浮点数? 在计算机系统的发展过程中,曾经提出过多种方法表达实数。 【1】典型的比如相对于浮点数的定点数(Fixed Poi原创 2020-12-11 10:36:54 · 3080 阅读 · 0 评论 -
BigDecimal为什么能做到高精度计算
BigDecimal的底层数据结构使什么?它是怎么保证精度的?这曾经是一道阿里巴巴的面试题,由于在工作中使用最多的是BigDecimal的加、减、乘、除的的方法,还真没想过它的实现原理(完全是拿来主义惹的祸),乍这么一问还真有点懵。BigDecimal保证精度的解决思路其实极其的简单朴素,还是用一句话来解释:十进制整数在转化成二进制数时不会有精度问题,那么把十进制小数扩大N倍让它在整数的维度上进行计算,并保留相应的精度信息。为什么要使用BigDecimal?我想只要是从事过JAVA金融产品研发.原创 2020-12-11 09:59:19 · 3442 阅读 · 2 评论 -
kafka分区数设置多少合适
kafka的每个topic都可以创建多个partition,partition的数量无上限,并不会像replica一样受限于broker的数量,因此partition的数量可以随心所欲的设置。那确定partition的数量就需要思考一些权衡因素。越多的partition可以提供更高的吞吐量在kafka中,单个partition是kafka并行操作的最小单元。每个partition可以独立接收推送的消息以及被consumer消费,相当于topic的一个子通道,partition和topic的关系.原创 2020-11-23 10:10:35 · 21540 阅读 · 3 评论 -
java 实现:字符串的所有排列的可能
题目描述: 输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 输入描述:输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。 解题思路: 对于这个问题,我们同样可以采用分解的办法。要求整个字符串的排列,可以看成两步:第一步:求所有可能出现在第一个位置的字符,即把第一个字符与后面的字符依次交换。第二步:固定一个字符,求后面所有字符的排列。原创 2020-08-24 16:47:02 · 696 阅读 · 0 评论 -
TimingWheel 时间轮详解
在kafka中,有许多请求并不是立即返回,而且处理完一些异步操作或者等待某些条件达成后才返回,这些请求一般都会带有timeout参数,表示如果timeout时间后服务端还不满足返回的条件,就判定此次请求为超时,这时候kafka同样要返回超时的响应给客户端,这样客户端才知道此次请求超时了。比如ack=-1的producer请求,就需要等待所有的isr备份完成了才可以返回给客户端,或者到达timeout时间了返回超时响应给客户端。上面的场景,可以用延迟任务来实现。也就是定义一个任务,在timeout时间后执原创 2020-11-09 15:30:22 · 207 阅读 · 0 评论 -
TiDB适用和不适用场景
TiDB 的典型的应用场景是:(1) 原业务的 MySQL 的业务遇到单机容量或者性能瓶颈时,可以考虑使用 TiDB 无缝替换 MySQL。TiDB 可以提供如下特性:吞吐量、存储和计算能力的水平扩展 水平伸缩时不停服务 强一致性分布式 ACID 事务(2) 大数据量下,MySQL 复杂查询很慢。(3) 大数据量下,数据增长很快,接近单机处理的极限,不想分库分表或者使用数据库中间件等对业务侵入性较大、对业务有约束的 Sharding 方案。(4) 大数据量下,有高并发实时写入、.原创 2020-11-06 17:08:00 · 847 阅读 · 0 评论 -
MySQL 日志系统之 redo log 和 binlog
MySQL 日志系统之 redo log 和 binlog之前我们了解了一条查询语句的执行流程,并介绍了执行过程中涉及的处理模块。一条查询语句的执行过程一般是经过连接器、分析器、优化器、执行器等功能模块,最后到达存储引擎。那么,一条 SQL 更新语句的执行流程又是怎样的呢?首先我们创建一个表 user_info,主键为 id,创建语句如下:CREATE TABLE `T` ( `ID` int(11) NOT NULL, `c` int(11) DEFAULT NULL, PR原创 2020-11-05 16:06:00 · 501 阅读 · 0 评论 -
彻底理解数据库的MVCC原理
ReadView中是当前活跃的事务ID列表,称之为m_ids,其中最小值为up_limit_id,最大值为low_limit_id,事务ID是事务开启时InnoDB分配的,其大小决定了事务开启的先后顺序,因此我们可以通过ID的大小关系来决定版本记录的可见性,具体判断流程如下:如果被访问版本的trx_id小于m_ids中的最小值up_limit_id,说明生成该版本的事务在ReadView生成前就已经提交了,所以该版本可以被当前事务访问。 如果被访问版本的trx_...原创 2020-11-02 20:57:12 · 187 阅读 · 0 评论 -
select、poll、epoll之间的区别
在RC隔离级别下,每个SELECT语句开始时,都会重新将当前系统中的所有的活跃事务拷贝到一个列表生成ReadView。二者的区别就在于生成ReadView的时间点不同,一个是事务之后第一个SELECT语句开始、一个是事务中每条SELECT语句开始。ReadView中是当前活跃的事务ID列表,称之为m_ids,其中最小值为up_limit_id,最大值为low_limit_id,事务ID是事务开启时InnoDB分配的,其大小决定了事务开启的先后顺序,因此我们可以通...原创 2020-10-30 15:32:43 · 395 阅读 · 1 评论 -
Golang Map实现原理
https://www.jianshu.com/p/7782d82f5154https://cloud.tencent.com/developer/article/1468799原创 2020-10-29 15:12:40 · 185 阅读 · 0 评论 -
count(1) 比 count(*) 效果高吗?
MySQL count(1) 真的比 count(*) 快么?你也一直和我一样认为 count(1) 真的比 count(*) 快么?突然有一天和同事聊这个事情,被狠狠的鄙视了一把。那么你自己研究过没?如果我告诉你他们一样,你信么?有 Where 条件的 count,会根据扫码结果count 一下所有的行数,其性能更依赖于你的 Where 条件,所以文章我们仅针对没有 Where 的情况进行说明。MyISAM 引擎会把一个表的总行数记录了下来,所以在执行 count() 的时候会直接返回数量原创 2020-10-29 13:58:08 · 110 阅读 · 0 评论 -
leetcode239滑动窗口最大值
1. 例题Leetcode 239题目:输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3输出: [3,3,5,5,6,7]解释:滑动窗口的位置 最大值--------------- -----[1 3 -1] -3 5 3 6 7 31 [3 -1 -3] 5 3 6 7 31 3 [-1 -3 5] 3 6 7...原创 2020-10-20 12:05:23 · 120 阅读 · 0 评论 -
正确理解mysql的间歇锁
看完这两篇文章,理解间歇锁:https://www.cnblogs.com/renolei/p/4673842.htmlhttps://www.cnblogs.com/crazylqy/p/7773492.html原创 2020-09-27 15:44:43 · 395 阅读 · 0 评论 -
MySQL 共享锁 (lock in share mode),排他锁 (for update)
共享锁 (lock in share mode)简介允许不同事务之前共享加锁读取,但不允许其它事务修改或者加入排他锁如果有修改必须等待一个事务提交完成,才可以执行,容易出现死锁共享锁事务之间的读取session1:start transaction;select * from test where id = 1 lock in share mode;session2:start transaction;select * from test where id = 1 lock原创 2020-09-24 10:52:07 · 814 阅读 · 0 评论 -
理解:Linux软连接和硬链接
1.Linux链接概念Linux链接分两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link)。默认情况下,ln命令产生硬链接。【硬连接】硬连接指通过索引节点来进行连接。在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode Index)。在Linux中,多个文件名指向同一索引节点是存在的。一般这种连接就是硬连接。硬连接的作用是允许一个文件拥有多个有效路径名,这样用户就可以建立硬连接到重要文件,以防止“误原创 2020-09-09 13:48:04 · 613 阅读 · 0 评论 -
java线程上下文切换,用于理解java程序cpu损耗分析。
0 前言在过去单CPU时代,单任务在一个时间点只能执行单一程序。之后发展到多任务阶段,计算机能在同一时间点并行执行多任务或多进程。虽然并不是真正意义上的“同一时间点”,而是多个任务或进程共享一个CPU,并交由操作系统来完成多任务间对CPU的运行切换,以使得每个任务都有机会获得一定的时间片运行。再后来发展到多线程技术,使得在一个程序内部能拥有多个线程并行执行。一个线程的执行可以被认为是一个CPU在执行该程序。当一个程序运行在多线程下,就好像有多个CPU在同时执行该程序。多线程比多任务更加有挑战。.原创 2020-09-01 23:26:07 · 1446 阅读 · 0 评论 -
南北桥芯片的定义
北桥芯片(NorthBridge)是主板芯片组中起主导作用的组成部分,也称为主桥(HostBridge)。北桥是个人电脑主板芯片组两枚大规模芯片中的一枚。北桥被用来处理高速信号,通常处理CPU(处理器),RAM(内存),AGP端口或PCI Express,和南桥芯片之间的通信。南桥芯片(South Bridge)是主板bai芯片组的重要du组成部分,一般位于主板上离CPU插槽较zhi远的下方,PCI插槽的附近dao,这种布局是考虑到它所连接的I/O总线较多,离处理器远一点有利于布线。主板上南北桥芯片原创 2020-09-01 22:35:26 · 2100 阅读 · 0 评论 -
java 实现:求有序数组绝对值最小的数
问题:有一个有序数组,如何求绝对值最小的数。形如:-10 -5 -2 7 15 20, 绝对值最小为-2思路:1。没有正数的情况下,最右边就是绝对值最小的2。没有负数的情况下,最左边就是绝对值最小的。3。有正数负数有0的情况下,找到04。只有正数负数的情况下,找到分界点package alg;public class MinAbsVal { public static int getAbsoluteValue(int[] a) { if (a == null原创 2020-09-01 19:04:32 · 1356 阅读 · 1 评论 -
进程管理和P V操作
计算机的核心是CPU,它承担了所有的计算任务;而操作系统是计算机的管理者,它负责任务的调度、资源的分配和管理,统领整个计算机硬件。一、操作系统的相关定义1、操作系统的定义:操作系统是控制和管理计算机硬件和软件资源、合理的组织计算机流程以方便用户使用的程序的集合。2、操作系统的特点:(1) 并发性。 并发性和并行性是有区别的两个不同概念。并行性是指两个或多个事件在同一时刻发生,而并发性是指两个或多个事件在同一时间间隔内发生。并发在宏观上是同时发生的,而在微观上是交替执行的。(2)共享性。.原创 2020-09-01 15:32:02 · 4221 阅读 · 0 评论 -
Java用两个栈实现一个队列、两个队列实现一个栈
思路:先将数据存到第一个栈里,再将第一个栈里的元素全部出栈到第二个栈,第二个栈出栈,即可达到先进先出package ds;import java.util.Queue;import java.util.Stack;import java.util.concurrent.LinkedBlockingQueue;public class StackToQueue<E> { Stack<E> stack1 = new Stack<E>(); .原创 2020-08-22 19:33:24 · 498 阅读 · 0 评论 -
java 复杂链表的复制
题目描述: 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)。 解题思路: 本题有以下三种解法: 第一种:先按照next复制,然后依次添加random指针,添加时需要定位random的位置,定位一次需要一次遍历,需要O(n^2)的复杂度。 第二种:先按照next复制,然后用一个hashmap保存原节点和复制后节点原创 2020-08-30 16:06:20 · 541 阅读 · 0 评论 -
Java 实现:判断二叉树A是否包含子树B
判断二叉树A是否包含子树B三种情况:1、二叉树A和B根节点相同2、B是A的左子树3、B是A的右子树/*题目输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)** */ /*思路** 先从根节点开始判断,* 1.如果根节点相同,则从头遍历* 2.如果根不同,则从左右两个遍历,任意一个含有B树都可以,如果失败则递归* doesTree1HasTree2函数负责递归两个遍历两个树,直到B树为空则返回true其余都是false**原创 2020-08-30 15:50:53 · 584 阅读 · 0 评论 -
Java elasticsearch实战---分页查询问题:scroll api
写在前面因为工作上的需要,记录下spring-data-elasticsearch与spring的配置,以及对应的海量数据全量拉取的过程。1.需求:查询es近3个月数据取出并进行重新推送。问题:原使用java分页查询es。可是到1w条数据后就会自动停止无法查询1w之后的数据。1.解决方案在上述后台错误信息中可以清楚的看到错误原因:Result window is too large, from + size must be less than or equal to: [100.原创 2020-08-25 12:03:30 · 2969 阅读 · 0 评论 -
Java实现:在二叉树中找到累加和为指定值的最长路径长度
给定一棵二叉树的头节点head和一个32位整数sum,二叉树节点值类型为整型,求累加和为sum的最长路径长度。路径是指从某个节点往下,每次多选择一个孩子节点或者不选所形成的节点链。思路:HashMap<Integer, Integer> sumMap = new HashMap<>(); //记录累加和 和 累加和在路径中最早出现的层数//比如说level为5时,curSum = 13,target = 5,那么就要看之前有没有和为8的出现//发现了...原创 2020-08-24 19:14:59 · 375 阅读 · 0 评论 -
java 输出二叉树的所有跟节点到叶子节点的路径
给定一个二叉树,返回所有从根节点到叶子节点的路径。说明: 叶子节点是指没有子节点的节点。示例: 输入:1/ \2 3\5输出: ["1->2->5", "1->3"] 解释: 所有根节点到叶子节点的路径为: 1->2->5, 1->3package ds;import java.util.LinkedList;import java.util.List;public class AllNodePath { ..原创 2020-08-23 21:56:03 · 1938 阅读 · 0 评论 -
java 实现:蛇形打印二叉树
103. Binary Tree Zigzag Level Order TraversalGiven a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from left to right, then right to left for the next level and alternate between).For example:Given binary tree [3,9,20原创 2020-08-16 17:49:13 · 554 阅读 · 0 评论 -
Linux sed命令实现替换文本内容的语法和awk的统计语法
/root/data/code-s3201/publish_codex/deploy/db.propertiesdb.properties中的1.0.0.6 替换为1.0.0.7sed -i 's/1.0.0.6/1.0.0.7/' /root/data/code-s3201/publish_codex/deploy/db.propertiescat /root/data/code-s3201/publish_codex/deploy/db.properties | grep '1.0...原创 2020-08-16 11:10:04 · 506 阅读 · 0 评论 -
Java实现LRU算法以及CLH队列的理解
一、LRU算法简介LRU(Least Recently Used)最近最久未使用算法常见应用场景:内存管理中的页面置换算法、缓存淘汰中的淘汰策略等二、实现理论 底层结构:双向链表 + HashMap ,双向链表由特定的哈希节点组成。(1)访问节点时,将其从原来位置删除,插入到双向链表头部;(2)更新节点时,先删除原有缓存数据(即原有节点),然后更新map映射,再将更新值作为节点插入链表头;更新后,判断容量是否超过最大内存使用量(3)超过则执行淘汰;淘汰即删除双向链表...原创 2020-08-16 00:09:02 · 291 阅读 · 0 评论 -
数据库系统为什么嫌弃swap
swap是干嘛的?在Linux下,SWAP的作用类似Windows系统下的“虚拟内存”。当物理内存不足时,拿出部分硬盘空间当SWAP分区(虚拟成内存)使用,从而解决内存容量不足的情况。SWAP意思是交换,顾名思义,当某进程向OS请求内存发现不足时,OS会把内存中暂时不用的数据交换出去,放在SWAP分区中,这个过程称为SWAP OUT。当某进程又需要这些数据且OS发现还有空闲物理内存时,又会把SWAP分区中的数据交换回物理内存中,这个过程称为SWAP IN。当然,swap大小是有上限的,一旦swa原创 2020-08-10 11:49:07 · 731 阅读 · 0 评论 -
算法学习:Java实现背包问题
1、0-1背包问题物品 重量 价格 吉他 1 1500 音响 4 3000 电脑 3 2000 背包的填表过程: 物品\重量 0磅 1磅 2磅 3磅 4磅 0 0 0 0 0 吉他 0 1500 1500 1500 1500 音响 0 1500 1500 1500 3000...原创 2020-08-08 23:28:39 · 575 阅读 · 0 评论