提交 9de0f59f 编写于 作者: 小傅哥's avatar 小傅哥

小傅哥,docs:文档

上级 2629ec44
1. 其实我也与你同样经历过这个阶段,从迷迷糊糊的C#转去互联网开发Java,跟你做外包的经历有异曲同工了吧。
2. 刚到互联网大厂时很多时候只能跟着人家,看人家都怎么写代码,怎么上线,如何排查线上问题等等,把眼里看的再自己去尝试总结记录,慢慢的一年下来,我终于能自己做个项目了。从慌到稳,用了一年!
3. 公司其实是有学习土壤效果的,不太可能说裸辞就能闭关修炼的好,离开公司很多时候是更慌张,不知道要学什么,也没有人和你交流问题了。
4. 以我个人的经验,代码要大量大量大量的写,尝试使用不同的技术完成不同的学习,带着一份兴趣爱好和一份执着精神,不断的打磨自己的技术能力。
5. 在学习知识的过程一定,一定要做笔记,否则你真的很难记得住像Java这样庞大的知识体系,一边学一边梳理一边总结再分享,折腾的多了,你也就会的多了。
6. 做事别着急,慢下来,别让焦躁的心情影响自己。坚持一个良好的早睡早起健身的习惯,在安排上合理的学习时间,哪怕一周总结完善一个非常不错的知识点,一年也要写50个文章的记录了。不在快在坚持!
我相信从你意识到自己不足开始,你会做的更好!
\ No newline at end of file
1. 从整个经历来看,其实你是有一个清晰的计划的👍,知道自己要大概从哪学,静下来心来慢慢折腾。
2. 我和你有过相似的经历,也干过2年C#,不过确实对那个语言没有感觉,从过往来看好在15年转做java了,否则薪资待遇要拉胯了!
3. 类似像你已经有了一定的积累,关于学习计划,可以从几方面入手:技术上(数据结构、算法逻辑、设计模式、架构设计、应用部署、框架源码、核心组件等)、思考上(了解业务、知晓产品、懂得什么是数据驱动、量化在做什么、为什么有这个需求、这个需求会带来什么,这些会辅助你提升技术建设能力,也能更好的落地如DDD领域驱动设计)
4. 长期看,找一个喜欢的技术点,深入学习,一直学习,不出2-3年,你会磨成那个领域的专家,抵挡35岁所谓的危机!
一起加油,同好!
\ No newline at end of file
1. 首先读到研究生,在求职时是一个非常好的敲门砖,也是个人见识和视野开阔的地方,更是知识深度学习探索的土壤提供方。
2. 在研究生求职阶段一般也会问到数据结构、算法逻辑和Java核心知识,以及对互联网常用框架的理解,比如:RPC、MQ、分布式任务、Redis、ZK、数据库,这个时候可以不必太贪多,但你可以把某些框架内容中的某个知识点夯实,做到问就能答到精彩,那你面试肯定没问题的。
3. 关于学习,要做到长期学习。从你喜欢编程开发,到现在你肯定也已经掌握了不少知识,尽可能去做梳理和沉淀,否则在你这个不真正开发项目的阶段,很容易忘记一些内容。但做笔记是很好的记录方式!
4. 研究生阶段学习,可以以学原理验证实践为主,比如当你遇到了HashMap,那你可能会接触到扰动函数、泊松分布、负载因子、散列算法等,以及你是否能解释出如:斐波那契数列为什么那么重要,它都有什么用途,解决了什么问题,在代码中有和体现。这里要知道,其实代码只是实现数学逻辑的工具,更多的时候编写代码都是运用代码提供的技巧、策略、方法,来尽可能实现数学约定,所以学习根基内容很重要。
加油!能在这个阶段知晓自己要努力就已经很好!
\ No newline at end of file
已阅
1. 看上去应该是家就在武汉,一直在武汉呆着可以。羡慕!
2. 关于跳槽,跑路前把在华为学到东西的包装下,简历写好后发给我,我给批阅下。
3. 技术内容上准备准备,你的几个公司,美的、科大还都不错的,也比较适合在那干的久点。
4. 下一份工作不要换的太频繁了,这个年纪稍微在一个公司网上爬爬,这样才能学到些非技术以外的很多技能和见识到新的姿势。
\ No newline at end of file
1. 竟然看到的眼熟的 PLC,这东西几千块一个吧!
2. 13年我也加入了这样的公司,做着一份需要用到C语言、串口线、中继器、PLC,来采集摄像头对物体的拍照识别以及控制传动器打码操作!
3. 虽然那2年做的事情和Java语言几乎没有关系,但好在我坚持每天5:30回家后,都不断的用Java语言把公司里遇到的项目翻新下,两年内几乎翻新了大部分我接触过的项目,等最后离职前还把组内的一个系统用Java语言+Netty组件实现了大屏数据采集,好在这份技术经历,让我面试其他公司的时候,有了非常不错且亮眼的内容。就这样15年我入职了互联网大厂!
4. 希望你在这一年,做做学习计划,不要只为眼前这点事耽误行进的脚步!
祝前行时:所求皆如愿、所行化坦途!
\ No newline at end of file
1. 其实每个人对学过的知识,只要是后续不再常用了,那基本也就会慢慢忘记的。
2. 但怎么样才能记得牢呢?一般我的做法是把一个知识点的的原理学明白,并把知识记录成笔记,以后哪怕是忘记了也会很快的捡起来。
3. 关于大厂,其实进大厂也没太难,主要考察你的技术深度、知识广度和项目经历,从这几方面下手后,你可以整理出一个思维导图,并把你自己从技术点到开发过项目的经历,依次整理出来。可以有会的和不会的,或者想学但没学的,当你整理完成后,也就有一个大概的要学的范围了,也不会那么迷茫。按照这样一个计划执行即可,不用着急!
\ No newline at end of file
已阅
1. 一般刚毕业不久的应届生或者刚来公司的头2年,一般负责的开发内容会相对简单,这时候也基本不太敢让新人搞大动作。
2. 但选择一个有成长土壤的环境熏陶着非常重要,当前你可以没参与这样的项目,但有身边同事在做,就可以学到很多。
3. 如果你希望早早的在职场就能承担起来点事情,可以深度的学习一些动作,做一些分享给同事,这样领导也会认识到你。
4. 在完成基本的开发外,想一下这样的项目还有没有可能把通用共性的问题,提出更合理的开发方式处理,这里面有时候可以挖掘出一些做中间件的地方,虽然可能最后不一定用到,但你做了就有的说。
5. 要多去尝试、多去验证,把各类自己能学到的内容,复用到实际开发中,验证自己想要的结果。这样进步会很快的!
\ No newline at end of file
1. 16年毕业的话后来有考本吗,自考本科毕业后一般入职京东、阿里只要技术过关,没问题
2. toB 业务对于新人学习有一个很大问题是没有流量,不像toC有海量用户,高并发场景,可以刺激到技术学习
3. 如果使用的技术很老,还是要去主动学一些互联网架构中常用的技术组件,也要阅读下源码。
4. 工作近5年了,要有一个学习规划,后面无论是跳槽还是在职内晋升,都要考虑好薪资、发展、家庭。
5. 学习要讲求学习方法,否则重复的事做的很多,但也不会有进步的体现。
6. 想虐面试官的话,其实不难。因为对于编程学习来说,很多人其实并不会去阅读有深度的源码知识,也不会了解到一个HashMap中还有泊松分布、扰动函数、红黑树转换等,但这些知识其实在很多中间件设计中都有所体现,尤其是数据库路由设计,那里面要很多的散列算法验证,路由设计等。所以只要你把知识夯实到一定程度,其实虐一部分面试官还是很容易的,基本求职不是问题。
综上,你需要做一个长期规划,如果你真的需要那么尽可能去读一个本科,技术上学习要学根本,5年了不能只看外表的展现结果。
加油!如果有其他问题,端午假期约聊。
\ No newline at end of file
【购买、返现、学习 - 说明介绍 v1.3】
- 专属链接【其他链接购买不返现】:https://www.aliyun.com/minisite/goods?taskPkg=1111ydsrwb&pkgSid=11388&recordId=1033318&userCode=is4kfbdt
- 白拿介绍:ECS突发性能型 t6 60元 返现60元 【这款性能只有20%cpu,部署java会有些卡】
- 强烈推荐:ECS计算型 c5、s6 新用户只有一次机会,可以搞个3年的,2核4G,部署java、zk、kafka,嗖嗖的!
**购买说明**
1. 不要:轻量应用服务器 58那款,这个限流量,被爬虫、被图片外链,就拉了。只能自己做做测试用,不能上生产。也不返现
2. 不要:低于60元的服务器,没有返现,没有返现,没有返现
3. 不要:选张家口服务器,花钱验证过,速度慢、速度慢
学习视频:https://mp.weixin.qq.com/s/GfztZFYYKMJppvp4rNwW_w
**非新用户**
自己支付的时候发现是原价,撸不到羊毛,换家人的支付宝一扫码登录就行,买完,绑定自己手机号,以后用自己手机号登录。稳!
**返现说明**
双11大促后,阿里云平台会给我全部订单记录,到时候会让群里发公告填写表单,对照着返现。- 放心傅哥很靠谱!
如何在项目中动态创建Java类,并注册进Spring容器,例如动态创建一个controller类?
1. 注册自定义的Bean到Spring容器中,需要实现 FactoryBean 接口,在getObject()创建你的Bean对象。
2. 定义代理Bean定义 GenericBeanDefinition,把定义的信息通过工具方法注册到Spring容器,BeanDefinitionReaderUtils.registerBeanDefinition(definitionHolder, registry);
3. 动态生成Java类需要用到字节码工具,ASM、Javassist、Byte-buddy,这几个都可以
参考我的文章:
怎么把Bean塞到Spring容器?https://mp.weixin.qq.com/s/wmB_uXDtDLbe4tYzSATDmw
字节码编程操作 http://mp.weixin.qq.com/mp/homepage?__biz=MzIxMDAwMDAxMw==&hid=16&sn=7533d469a7c4abd1b2b7f8a5eb091e65&scene=18#wechat_redirect
---
小傅哥,请问大厂的默认jar包启动参数都会配置哪些呀,JVM参数调优有总结方法论吗?
1. 通常并不启动jar包,都是把war包部署上去,从代码的打包过程到上线都是使用部署上线工具,如:Jenkins
2. JVM 通常情况下并不会去调优,都是一套默认配置,比如你的启动参数内存大小。也不会因为程序内存占用大了就去调JVM,基本都是对程序进行优化。所以这块暂时没有更多的真实场景去调JVM的情况。
3. 如果是面试一般会考察调优包括:调整GC类型和内存分配、年轻代和年老代的分配比等。也有一些常用命令:jps、jcmd、jinfo、jmap、jhat、jstack等,https://mp.weixin.qq.com/s/rTuEp8A35_xnx1HA_K8zQg
后续我在看看,有没有一些JVM运维调优的策略和手段,整理好后补充到这里。
想深入学习一个字节码框架,听说了javassit、asm、ByteBuddy、cglib啥的,小傅哥帮忙大概介绍下,想入手ByteBuddy咋样。
框架介绍:
1. ASM 是一个 Java 字节码操控框架。它能被用来动态生成类或者增强既有类的功能。ASM 可以直接产生二进制 class 文件,也可以在类被加载入 Java 虚拟机之前动态改变类行为。Java class 被存储在严格格式定义的 .class 文件里,这些类文件拥有足够的元数据来解析类中的所有元素:类名称、方法、属性以及 Java 字节码(指令)。ASM 从类文件中读入信息后,能够改变类行为,分析类信息,甚至能够根据用户要求生成新类。
2. Javassist 是一个开源的分析、编辑和创建Java字节码的类库。是由东京工业大学的数学和计算机科学系的 Shigeru Chiba (千叶 滋)所创建的。它已加入了开放源代码JBoss 应用服务器项目,通过使用Javassist对字节码操作为JBoss实现动态"AOP"框架。
3. Byte Buddy 是一个代码生成和操作库,用于在 Java 应用程序运行时创建和修改 Java 类,而无需编译器的帮助。除了 Java 类库附带的代码生成实用程序外,Byte Buddy 还允许创建任意类,并且不限于实现用于创建运行时代理的接口。此外,Byte Buddy 提供了一种方便的 API,可以使用 Java 代理或在构建过程中手动更改类。2015年10月,Byte Buddy被 Oracle 授予了 Duke’s Choice大奖。该奖项对Byte Buddy的“ Java技术方面的巨大创新 ”表示赞赏。我们为获得此奖项感到非常荣幸,并感谢所有帮助Byte Buddy取得成功的用户以及其他所有人。我们真的很感激!
使用总结:
1. ASM 纯字节码操作,可以结合 IDEA 插件:ASM Bytecode Outline,进行使用。它能把你的普通 Java 代码转换为使用 ASM 操作时,应该做如何的处理。但 ASM 是使用上最复杂也是功能最强的框架,很多其他框架Cglib、Javassist、Byte-buddy 都是基于 ASM 开发的。
2. Javaassit 市面上很多基于 javaagent 实现的非入侵的全链路监控都是使用的此框架完成,因为它的性能稳定,操作简单,功能丰富,既可以使用提供的 API 也可以操作字节码,所以使用起来会更加方便,遇到问题也可以很快的找到解决方案。
3. Byte Buddy 我是非常喜欢这个框架,因为他可以让对字节码的操作简化为像写普通的程序代码一样,非常容易完成一些需求逻辑的实现,并且它还是一个获奖项目!
最后说明:
其实你可以把几款字节码插桩组件都了解下,完成同一个复杂场景的功能,看看各自的实现是否能满足你的需要,之后选取那个最合适你的。
---
小傅哥你好,我想问一下组件类以聚合工程方式引入还是以自定义start方式引入更好呢,个人感觉以jar包方式总改版本号好麻烦啊
1. 通常我们会把非业务逻辑的共性通用问题,抽取成独立的服务开发成各个领域的技术模块,这类的通常会采用中间件的方式开发。如果是Spring直接开发就行了,SpringBoot 则包装成 Starter。
2. 如果是一些项目中用到的需求逻辑,不具备共性问题的提取,本身就是属于项目的一部分,直接以项目模块 Module 的方式聚合即可,这样引入起来也方便,更符合开发使用。
---
小傅哥,程序员应该有一个副业嘛?
时常焦虑,看到一些优秀的程序员 去做小程序,外卖引流,知乎好物 部分做的好的收益都不错,自己本身没有稳定收入副业。 所以被弄得很焦虑。想向傅哥请教一下 如何去分配这个时间,对抗焦虑
提个背景:上大学的时候,很多同学放假了喜欢去做一些兼职、发发传单、洗洗盘子、当当家教,但其实我并不会支持去做这些,因为所有的此类事情与你的自身长期价值积累并不符,只能带来一点社会体验和分支经历。如果你能把这个时间放在属于你未来想做的事上,积累此类知识、经验、阅历,那么将来会给你带来更大的价值,所以我更推荐做长期有价值的事。
关于副业:其实我一直折腾此类事情,包括之前说的接私活、当网课老师、给人家做网站、还有猪八戒网的需求,折腾过后感觉这类内容的副业,需要你有一个稳定且并不小的时间投入,能赚到一点钱,但不太可能长久,因为毕竟目前你仍然需要以工作为主,在一个能满足你成长的土壤中,不断的加强自己的能力。比如你在职场的职位、收入、人脉,这些可能更是你现阶段的目标,不同的人在不同的阶段有不同的选择,但目前对你来说,搞副业,最好只当练手,提升额外的能力,先不要把赚钱看的太重,并从这些折腾的过程中,找到符合自己想做的事情。
拒绝焦虑:向阳而生、逐光而行,减少没必要的内心焦虑,你做的任何一件事将来都会汇聚在一起,慢慢铺自己的地基,不要着急于快。在时间分配上,也不要想着什么都做,人的精力也是有限的,不要给自己压榨的太狠,适当的放松非常有必要。千万记得要慢下来、慢下来、慢下来!
---
用了 spring security ,如果有权限的动态刷新,不想引入缓存这类东西,也不用主动推送,有没有什么好的办法解决已登陆用户的权限修改?
首先:你的场景是有什么限定吗,权限使用过程中的校验可以直接读库不,因为我感觉你这个体量并不大,如果可以读库验证,直接修改库就可以了。
通常:一个权限的变更,需要走审批流程并要求用户退出登录,验证身份,才可以使用新的权限职责,避免因为权限范围扩大,导致之前账号借用等操作风险的发生(不过这个依赖于不同场景的风险级别而决定设计)。
---
如何通过javaagent方式实现http服务之间的header信息传递?Hystrix线程隔离策略或者多线程下如何实现呢?
1. 基于字节码框架(ASM、Byte-buddy、javassit)插桩和 Javaagent 能力实现的非入侵全链路监控系统,具备的特质包括:
1.1 低侵入性:监控系统应尽可能减少对业务系统的侵入,保持对使用方的透明性,减少开发人员的负担,降低接入门槛和难度。
1.2 低性能影响:由于全链路监控系统需要对各种应用中间件进行日志数据采集,大多都需要在业务系统内进行“埋点”或放置agent,一般都是在核心业务流程。因此应尽可能降低对业务系统造成的性能影响,一般来说,对CPU的耗用低于1%~2%可以作为一个参考阈值。
1.3 灵活全面的接入策略:为了尽可能降低接入成本,应该提供灵活的监控配置策略包括配置在服务器端方便升级,让业务方决定是否接入,以及收集数据的范围和粒度,并提供对应的技术方案保障监控策略生效。
1.4 时效性:实时有效的监控数据展示功能,帮助相关人员理解系统行为,为流程、架构、代码优化,以及扩容缩容、服务限流降级提供正确客观的数据参考。
2. 所有基于此类技术实现的监控系统,都需要给一次调用生成唯一ID,并在 http3x、http4x 中使用 setRequestHeader 方式进行传递。另外在 RPC 框架中如 Dubbo 也会有透传信息的字段,给予监控系统使用。
3. 关于全链路监控的学习,可以参考以下内容:
3.1 pinpoint:https://github.com/pinpoint-apm/pinpoint
3.2 bee-apm:https://github.com/itstack-org/bee-apm
---
傅哥 您好 想问一下MESA管程模型设计成两个队列的用意是什么 如果只有一个入口队列不行吗?这个模型套在AQS上好像也一样。AQS也是两个队列 同步队列还是可以理解的 但是AQS多设计一个等待队列的意义是什么也不太懂
AQS:
* +------+ prev +-----+ +-----+
* head | | <---- | | <---- | | tail
* +------+ +-----+ +-----+
1. AbstractQueuedSynchronizer 从名字上就可看出本质是一个队列(Queue),其内部维护着 FIFO 的双向队列,也就是变体 CLH 队列的实现。
2. 所有的 Lock 都是基于 AQS 来实现了。AQS 和 Condition 各自维护了不同的队列,在使用 lock 和 conditio n的时候,其实就是两个队列的互相移动。那么你说的两个队列,只的是 Condition 队列吗?
管程(新了解内容,以前没注意过):
1. 管程就是指管理共享变量,以及对共享变量的相关操作。具体到 Java 语言中,管程就是管理类的成员变量和方法,让这个类是线程安全的。管程的发展史中,先后出现过三种管程模型,Hasen 模型、Hoare 模型和 MESA 模型,Java 使用的是 MESA 模型。
2. 使用管程模型主要是解决并发编程中的两个核心问题,互斥和同步。互斥是指同一时刻只允许一个线程访问共享资源,同步则是指线程之间如何通信、写作。
3. 解决互斥:将共享变量及对共享变量的操作统一封装起来
4. 解决同步:管程模型与上厕所排队的流程类似,管程入口处有一个等待队列。当多个线程试图进入管程内部的时候,只允许一个线程进入,其他线程在等待队列中等待。就和上厕所的时候排队一样。
综上:一般此类实现除了消费队列,还需有等待队列,以便于实现 Lock 相关内容。推荐阅读:《Java并发编程实践》 不确定以上是否为你需要的,可以回复讨论。
---
微服务应用之间调用接口,如何控制权限?
1. 通过在微服务 RPC 接口或者网关层接口,配置权限校验组件,这类组件一般是自研的。通过校验组件设置接口调用权限码,调用时需要传一个固定的分配值。
2. 指定服务器名称、服务器IP,进行调用,非此信息以外的服务不能被链接调用。
3. 通过开发接口间非对称加密传输安全校验的,一般用在双方为安全级别较高的接口调用上。
4. 接口自由度较高的申请获取字段查询,申请时候会分配一个有效签约期的授权码,拿到授权码后,可以调用指定接口。
---
小傅哥,这是我按你昨天说的整理的目前项目的技术栈和想要学的技术栈。期待你的建议。
从目前你的技术使用上来看,其实广度是有的,只是缺少一些深度的学习和使用。建议:
第一阶段:学习下数据结构、算法逻辑(仅Jdk自身的即可,HashMap、ArrayList、AQS等来夯实java能力)、设计模式,这些技术是后续的学习其他技术的基础。
第二阶段:学习 MyBatis 源码,至少要能搞懂“为什么,不写具体的DAO实现类,就能通过配置文件或者注解执行对数据库的增删改查操作”,这个知识会让你把Spring常用接口和类串联起来,也可以把代理、反射、解析xml、连接池使用上。
第三阶段:学习 Spring 源码,学习完成后尝试结合 Spring 写一些中间件,比如数据库路由组件、ES查询引擎组件,这些在我写的《SpringBoot中间件设计和开发》中都有例子。
第四阶段:补充对 MQ、SpringCloud、ES 等框架类的深入学习,要学习它的设计架构、核心源码、技术目的、使用场景。
第五阶段:完成较难度项目的开发,比如实现一个分布式架构下的活动抽奖系统,如何设计其中的秒杀、抽奖算法、奖品发放,这个项目可以模拟小程序中一些抽奖的设计去实现。
---
设计一个系统,应该要考虑/着重要关注的点在那些?以及设计一个系统的流程顺序应该是怎么样的? 比如我需要设计一个消息中心/通知中心这样的东西 谢谢啦
除了通用的设计规范:高可用、高并发、易扩展外,还会根据具体的业务系统场景做具体的设计,比如你说的消息通知中心;
1. 你的系统要满足多少用户访问,面向的群体是什么样,通知触达消息、通知手机push、是否需要发送短信,是否和一些外部的触达系统对接等等
2. 这个系统需要用到哪些技术栈,整体的技术架构是什么样,这些技术点团队里是否都有过使用经验,对于新技术是否有过技术调研和评审
3. 在系统的流程设计上,一般包括:产品PRD评审、架构整体设计、研发技术设计、研发技术评审、进入开发阶段、日会进度风险汇报、研发完成提测、提测报告(含文档和单元测试等)、测试通过、研发通知上线。
4. 如果是电商系统,还会考虑下单、支付、发货流程,中间还会有是否有秒杀场景、系统设计中是否有分布式锁的优化等等,所以在设计的大框架之外,还有因为不同项目的具体设计情况,这部分也是一种经验的总结。
---
大佬你好,话说分库分表排序怎么处理呢??
一般是以用户维度的分库分表,所以:
1. 通常对个人信息的排序直接从库里去就可以,不涉及夸库。
2. 如果排序数据不多,一般也可以加入到redis中。
3. 如果是夸库涉及到排序,需要把分库分表数据通过数据库 binlog 日志,使用 otter 工具,把数据同步到ES,在从ES查询使用。
---
1. Class<? extends ICacheAdapter>,关键字 extends 在这里不只是继承的含义,也包括了对接口的实现。所以可以传入一个实现 ICacheAdapter 接口的具体对象,用于实例化。
2. 可以修改为 Class<T> cacheClazz,因为 T 表示的类型就是 CacheService 的类型。
3. 此场景多用于解决所有项目工程中的共性问题,而开发的一类中间件方案。
欢迎多提问,哈哈哈。下次提问可以选上面的提问给我,这样避免我漏掉。
---
你好小傅哥,对于工作量量化你有过什么经历或者经验吗
确实有不少的项目在开发过程中需要被量化,因为量化后时间基本也就能确定一个项目开发的排期。那么为了能更加准确的量化这个时间,通常我们会把项目拆分各个模块,再把模块分配给个人,每一个模块的开发时间由个人提供,之后再对出所有模块的联调时间,以及完成后的一个提测时间。最终就可以把整个工作量的一个排期输出出来了,但通常也会在这个时间节奏上留出一个buffer便于出现紧急问题时,还来得及调整。另外,对于这样的量化的排期的项目,要每天过日会统计开发进度、遇到的风险事项、外部协调推动、环境部署等各种问题的汇总和解决进度,这样才能更好的把控开发进度和一个上线时间。
内存泄露:是在为程序申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光,广义并通俗的说,就是:不再会被使用的对象或者变量占用的内存不能被回收,就是内存泄露。
使用场景:通常在数据库路由组件、基于Javaagent和字节码插桩的全链路监控组件中,都会有 ThreadLocal 以及增强的使用,用于记录同一个线程下之间调用,在最终的时候摘取调用链路上的信息。如:数据库路由设计会从 ThreadLocal 中获取分库分表信息。
泄漏原因:使用 ThreadLocal 但不在最后使用 ThreadLocal#remove 时,作为弱引用的 key 势必会在不调用时候被 GC 回收,这样就会导致 key 为 null,而 value 还存在着强引用。只有当线程完成退出后,强引用的链条才会断掉。否则链路 Thread Ref -> Thread -> ThreadLocalMap -> Entry -> value 永远无法回收,造成内存泄漏。
一些知识:
1. 由于 Thread 中包含变量 ThreadLocalMap,因此 ThreadLocalMap 与 Thread 的生命周期是一样长,如果都没有手动删除对应key,都会导致内存泄漏。
2. 但是使用弱引用可以多一层保障:弱引用 ThreadLocal 不会内存泄漏,对应的 value 在下一次 ThreadLocalMap 调用set()、get()、remove()的时候会被清除,但如果有大量的线程操作一样有风险。
3. ThreadLocal 内存泄漏的根源是:由于 ThreadLocalMap 的生命周期跟 Thread 一样长,如果没有手动删除对应 key 就会导致内存泄漏,而不是因为弱引用。
4. 每次使用完 ThreadLocal 都调用它的 remove() 方法清除数据。
5. 将 ThreadLocal 变量定义成 private static,这样就一直存在 ThreadLocal 的强引用,也就能保证任何时候都能通过 ThreadLocal 的弱引用访问到 Entry 的 value 值,进而清除掉。
\ No newline at end of file
小傅哥,想问问你一般是怎么进行功能拆解和梳理的,有的时候明明好好的梳理后,到开发时还会遇到某些功能没有考虑完善。
问题和建议:
1. 研发做细节设计进行拆解和梳理后有无架构师、前端&后端、测试、产品、运营等项目成员参与评审?
2. 产品是否在开发阶段继续增加或者调整需求了?
3. 研发在开发时候是否完全遵守开了开发的规则标准?
4. 另外即使最完整的设计,也可能会在具体的开发实现过程中,遇到一些功能是设计阶段没有考虑清楚的。但只要这个变化是可控的就可以。
---
小傅哥,作为入行不久的人来说,是关注技术深度,还是关注技术广度。
以我个人的经验来看,技术广度和技术深度的学习是相辅相成的,当你能拿起铁锹挖土、挖沙子、挖坑,挖的多了就会想着能不能来个挖掘机深入的挖一下!
在你所能接触的日常业务开发过程中,一定会潜移默化的开始听闻到知晓到了解到学习各种各样的技术,以及为了解决某个问题时研究新的组件或者框架。对于新人来说其实你最开始手里的能力也就只能让你用这些框架或者轮子,只有当你不断的一点点熟练各个框架后,才可能深入的去了解一些技术的内核,但这些技术的内核又和其他技术关联。只要你不断的学习,你就会遇到一会需要扩宽技术知晓度,一会又要深挖技术底层实现,这样的学习过程像一个双螺旋结构,互相相应着。
所以,对你现在来说可以更多的关注使用,但在使用完成后进行总结,尝试去阅读一些自己好像很难理解的技术内容,慢慢的,这些知识会随时你学习时间的增加,一点点被你的大脑吸收!
---
小傅哥,来自传统行业,项目多为管理系统,出去面试的时候很吃亏,请问这种情况该怎么包装项目经验,获得更多的面试机会,谢谢!
一般管理系统都是面向B端人群使用,此类系统很难有一些技术上的亮点,比如:分库分表、分布式开发、并发经验、秒杀场景、系统优化等,那么如果需要包装,其实也就是需要自己学习补充此类技术内容。
可以参考学习的类型项目包括以下三方面:
组件:以考察源码以及核心技术的使用能力,比如开发一些:RPC、网关、数据库路由、分布式任务等,把这样的技术学习是使用放到面试简历中,一定是会加分的。如果有学习此类内容的想法,建议先阅读设计、之后是 Spring 源码,最后是关于中间件的设计和开发。这三项内容目前小傅哥都有写,可以进行学习。
业务:通常你出去面试特别高频的问题,往往集中在电商、交易、秒杀、抽奖、活动这些方面,那么你可以有针对性的在 github 搜索一些关于此类的项目,还是蛮多的。
运维:此类项目多以部署服务、系统压测、性能监控、插件开发为主,比如一些低代码平台也是从此类技术中衍生出来的,如果你能在面试中说上一些,也是非常不错的。
没有空空荡荡的包装,只有深入的学习和实践,才能在面试中不被问住!从以上这些方面下手吧!
---
问一个工作中遇到的问题,需要导出数据生成excel,整个流程就是读数据-->生成excel(单sheet页)-->每200个生成7z压缩包-->上传文件服务器-->更新任务,生成excel时使用了多线程,目前从日志情况看来1s生成一个,还有什么方法可以优化生成速度,目前想到了excel模板读入内存中,别的还请给点优化建议
一般此类集中式的任务,建议通过分布式的方式进行处理。可以把多线程拆分为多服务操作。比如:
1. 使用分布式任务的方式进行处理,把需要生成的 excel 划分为不同的任务清单,之后这个清单信息交给分布式集群中不同的任务实例进行处理。
2. 也可以通过MQ的方式替换多线程生成,也算是一种把生成excel的任务拆解到不同的机器上去执行。
3. 其实无论如何都是在想办法去集中化,没必要非得压榨一台机器的性能,除非你那只有一台机器。
---
提问:傅哥 我想了解下互联网公司在项目上线前是如何进行一个全面的性能测试的。比如内存占用,cpu占用,还有网络的负载情况等等
一般较大型的互联网公司都有比较完善的运维服务,包括上线发布、系统监控、数据库监控、机器监控、网络监控等等,这些监控系统中可以提供:日志打印、链路追踪、TP99、TP999、QPS、TPS、可用率、调用时长、数据库耗时、redis耗时、逻辑耗时、内存占比、CPU、LOAD、IO、数据库慢查询、数据库连接数、数据库事务等等。基本上目前在阿里以及专门做监控组件的公司,都提供了以上各种监控工具,可以使用下。
例如:使用字节码插桩方式的非入侵的全链路监控,就能打印各项信息。
==========================================================
onTransformation:class org.itstack.demo.test.ApiTest
测试结果:hi2 悟空
测试结果:hi1 哪咤
测试结果:hi3 悟空
链路追踪(MQ):608a1cbf-ef1f-4195-bdc7-c3729a114f8d org.itstack.demo.test.ApiTest.http_lt3 耗时:111ms
测试结果:hi2 哪咤
init: 192MB max: 2708MB used: 43MB committed: 184MB use rate: 23%
init: 2MB max: 0MB used: 13MB committed: 14MB use rate: 95%
name: PS Scavenge count:0 took:0 pool name:[PS Eden Space, PS Survivor Space]
name: PS MarkSweep count:0 took:0 pool name:[PS Eden Space, PS Survivor Space, PS Old Gen]
-------------------------------------------------------------------------------------------------
链路追踪(MQ):608a1cbf-ef1f-4195-bdc7-c3729a114f8d org.itstack.demo.test.ApiTest.http_lt2 耗时:338ms
init: 192MB max: 2708MB used: 43MB committed: 184MB use rate: 23%
init: 2MB max: 0MB used: 13MB committed: 14MB use rate: 95%
name: PS Scavenge count:0 took:0 pool name:[PS Eden Space, PS Survivor Space]
name: PS MarkSweep count:0 took:0 pool name:[PS Eden Space, PS Survivor Space, PS Old Gen]
-------------------------------------------------------------------------------------------------
---
你好,傅哥,我是从读者晋级成粉丝的,最早就看过傅哥第一版的关于设计模式的文章,写的很有意思,奈何一致没找到组织,哈哈,傅哥,想跟您聊一下几个问题,最近太困扰我了
1.面临选择,回家和继续在一线城市中奋斗, 其实生活都是自己选择的,可是非得两难的处境中挣扎,对于我自身,属于Java后端的从业者,目前是工作时间不到两年,除了提升自己技术之外,也更需要锻炼自己的抵抗外界的不确定性,想问一下傅哥就目前而言,如何技术实力提升的同时,需要习惯或者思维方式,可以更好的锻炼自己,想要进大厂
2.对于技术学习,一般从什么开始,我可能就直接从官网,或者搜个视频就直接开始了,但是感觉自己学的技术点很松散,想问一下傅哥,您如果学习一个新的技术点,比如dubbo的,怎么系统开始,多面手的展开
3.傅哥的文章我基本都在读,公众号中的文章质量都很高,基本是一周2-3 篇, 很干货,您平时都是怎么做时间管理的?对于自己一天您一般时怎么规划的?
4.傅哥,最近看的一本书是什么?
1. 不知道你目前是否在大厂还是一般的小企业中,在技术学习上是否可以有充足的土壤环境?
2. 其实除了一线城市,其他很多城市并没有这样的技术氛围,如果冒然离开,可能自己会后悔。
3. 就我自己而言,工作两年的时候,正是从一个传统的外包行业跳槽到互联网。因为平时喜欢折腾各类技术,也经常总结整理资料,所以从传统行业到互联网并没有太大的压力。
4. 在公司中工作不太可能一直长久下去,到了一定年纪可以开始考虑以后的出路,比如35-40岁,自己还能做点什么、身体还健康吗、坚持跑步吗、持续学习吗,这些都是你在不确定性因素中获利的必要条件。
5. 关于技术学习,我的方式是:头几年时候自己积累的少,新技术完全没用过,就找视频、找案例,越简单、越快速入门越好。但随着时间的推移和自身技术的积累,目前对于新技术的学习,我更喜欢先做做案例,之后看看源码。就比如 RPC 框架 Dubbo 而言,我的方式是照着它的源码,自己实现了一个简单的 RPC 服务,别说,实现完之后,真的是很通透。但这样的手写的方式对新人压力不小,你需要学过一定的设计模式、Spring源码、扩展类的技术如Netty、字节码框架等等,来支撑你学习新技术点中的各项内容。
6. 目前我的时间安排,主要是早睡早起、起来跑步、周末肝文、假期肝文,日常时间积累碎片内容,大块时间时候进行整理。两年时间中,基本没有过一个较长的假期用于玩,都是在写文章,哪怕是在医院陪床的时候。对了,还有一个非常重要的点,就是离公司非常近,可以走路回家。
7. 关于看书,以前学习的过程主要以看书为主,每个月都会拿出一部分钱用来买书,买服务器、买资料、总之只要是有价值于我的内容,我不会把钱浪费在出去玩、出去喝上。而目前学习的方式主要是看源码、文档、做案例,所以看书的内容就会少一些。有时候出版社送的书,会阅读下,以及逛图书馆的时候会翻阅翻阅。
希望你可以继续坚持学习下来,每一个知识项只要你能一直坚持做,2-3年一定可以成为这个领域的专家,职位和收入也会随之而来!
---
问个跟之前相关的问题,我也是来自传统行业,目前项目是springboot+dubbo。但是就看的招聘看,springcloud已经成为必须得技能,目前从我看到的两门慕课网课程来看,基本的springcloud技术栈功能都很浅很少。。想问问小傅哥有什么好的学习建议或者系列专栏博客之类的。视频课程也行。或者有什么从零上手的springcloud开源项目。同理,在面试之前,传统行业,我们如何学习工作之外的技术栈。
1. 其实较大型的互联网中 SpringCloud 使用的没有 Dubbo 或者公司自研的 RPC 框架多。
2. SpringBoot + Mybatis + Dubbo + MQ + 分布式任务 + 分库分表 + 配置中心 + 网关 + 数据同步 ES 的组合比较多。
3. 学习 SpringCloud 推荐:https://github.com/forezp/SpringCloudLearning
4. 传统行业职位的技术栈,这个我建议你先梳理出一个 xmind 表,列出你目前已经会的技术、想学的技术,之后我按照互联网中用到的技术栈,来给你总结,告诉你可以先从哪个开始。
\ No newline at end of file
感谢 王艺羲 对星球的支持!
1. 基础方面,还需要有 Spring、SpringBoot、Mybatis、SpringMVC 的相关知识,最起码是可以搭建出一个能Web程序所用到的技术栈。
2. 拓展方面,除了一些基础技术还可以了解下 MQ、Dubbo(也就是你手写的练习项目 RPC)、分布式任务,注册中心 zk等,这些技术是一个分布式项目的搭建技术栈。
3. 刷题方面,有些公司是比较重视刷题的,比如字节、腾讯等对应届生还是会有算法的考察,一些其他互联网可能对算法的考察会弱一些。不过建议在刷题上可以在继续,困难的题目可以尝试一些,等到临近面试时再复习下。因为这类内容实际项目中用到不多,所以需要在后续不使用的情况下,是容易忘记的,最好是加强练习,或者从数据结构和算法逻辑开始学起,让自己真正懂的为什么是这么做,那么做可以不。
4. 项目方面,目前你做的这两个项目 RPC 是属于中间件类型,工业监控系统属也非面向C端,这类项目可能会在技术上缺少一些热门考察内容的体现,比如你对 Redis 分布式锁的应用、接口幂等性的应用等。所以在项目准备上可以在 Github 找一些面向C端的互联网项目,比如电商、活动、抽奖、裂变等,把这类项目学习下,尤其是里面涉及到的支付、下单、秒杀、发货等,适当的把这些内容看源码熟悉下,如果能看懂的话就把他们的代码简化下,自己实现试试。另外星球里也准备带着大家做一个抽奖面向C端的项目,近期也开始启动了。
5. 学习目标,深入Java核心、日常刷题、熟悉项目,如果你是找一份开发工作,操作系统和计网可能不会考察的太多,但适当的深入了解会有加分项。尤其是还没毕业的研究生,一般会对基础考察的比较多,数据结构、算法逻辑、设计模式、Java核心基础、部分框架源码等。那么就可以对这些基础能力和算法以及你现在已经学到手的操作系统和计算机网络再学习下。
6. 简历反馈(个人技能),个人技能可以放到项目经历上,一般面试会先去考察你的个人基础技能,也就是问问算法、源码、框架。你这部分比较缺少 Spring、SpringBoot、Mybatis 列举出来的内容,比如说熟悉 Bean 的声明周期、注册过程。这部分可以参考最近手写Spring的内容 https://github.com/fuzhengwei/small-spring ,也可以补充上对 Mybatis 这样 ORM 框架的熟悉。这部分内容学习不会浪费太多时间。另外你列举的其他内容,ArrayList、HashMap、内存模型、垃圾回收、Mysql 索引等,都需要去深入了解下,这些会成为考察的问题项。面试也是一场有准备的挖坑,你给面试官挖好坑,他会自己跳进去的。所以把问题和答案提前列举好。
7. 简历反馈(项目经历),第一个项目监控平台,如果说面试的公司做的项目是此类的,那么加分项很大。如果非这样公司,可能仅仅是你对技术的一个学习使用,互联网面向C端,很少会有这样项目。这个主要看你要求职哪个公司了。RPC 项目是一种中间件技术,用于解决分布式系统中,模块间的调用问题,所以这个项目属于互联网类,涉及的技术也多。比如你对 Netty 传输方面了解的半包、粘包以及流量整形等,这些可以在了解下会成为问题点。另外是关于动态代理、反射调用,代理对象怎么交给Spring管理的等等,如果你是亲自操作过,那么几乎这些问题对你来说还好。此外如果能再准备一个面向C端的项目会更好。最后在项目的描述上增加一个 解决问题,类似这样的点,用于描述你在项目上,在什么场景、遇到了什么问题、你怎么解决的、学到了什么,方便面试官问你,也方便你回答。
8. 简历反馈(其他方面),奖项、自评,都很赞👍,羡慕!
遇到一些其他问题也可以微信我,fustack 小姐姐很优秀,加油!愿所有的努力可以让你,所求皆如愿、所行化坦途!
\ No newline at end of file
首先其实较大型互联网公司中都会有自己的MQ、RPC、分布式任务、配置中心等服务,这主要是因为基于业务体量和自身服务整合使用考虑。
但对于一些小公司没有自研的投入的话,可以按需选择一些现有开源的MQ服务,按照自身的业务体量和场景选择:ActiveMQ、RabbitMQ、RocketMQ、Kafka (参考下图)
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册