精华内容
下载资源
问答
  • 微信公众号:bugstack虫洞栈,欢迎您的关注&获取更多案例与源码!博客栈:https://bugstack.cn 本专题针对netty4.x分为从;基础入门篇(九篇)、中级拓展篇(八篇)、高级应用篇(三章),由浅入深实现netty服务功能,...

    bugstack虫洞栈 | 沉淀、分享、成长,让自己和他人都能有所收获!

    • Netty介绍
      Netty是由JBOSS提供的一个java开源框架,现为 Github上的独立项目。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。

    • 为什么要学?
      因为你要涨工资!无论是在互联网还是在物联网开发中,都离不开Socket通信,尤其是在5G的时代会有更多的数据传输需求。而Netty是一款非常niubility的Socket框架,是通信编程变得更加容易易用。

    • 哪些框架里可以看到Netty?
      各类RPC框架比如Dubbo(这可能也是你面试常被问到的吧?痛不痛)、还有MQ、注册中心,还有网页聊天,物联网,简直太多地方都需要用到Netty

    • 那么怎么学?
      说了这么多,那么怎么学呢?Netty目前市面的资料并不多,很多还是我写的(15年就写了netty5.0的案例,但后来netty说他5.0写的有问题,所以就又回到netty4.x了!),而且对于一个新人想快速入门那么一定是,事必躬亲、亲力亲为,去实践hello world,而不是上来就搞理论。而我!你们的小付哥,已经将Netty所有需要用到的案例都编写出案例,可以一步步跟着学习,学完保证你可以上手开发;

    展开全文
  • 非常详细综合的java知识点整理,包括;jvm、java集合、java多线程并发、java基础、spring原理、微服务、netty与rpc、网络、日志、zookeeper、kafka、...bugstack虫洞栈,强烈推荐!欢迎下载学习,感谢作者辛苦付出!
  • bugstack虫洞栈——面经#27 实例查看回收过程 10. 实例验证GC 老是说GC,如何看到GC运行的实际效果?TALK IS CHEAP,SHOW ME THE CODE 举个例子:(例子来源:bugstack虫洞栈——面经#27) 测试代码: public ...

    视频学习:【狂神说Java】JVM快速入门篇

    相关资料:

    1. 《深入理解Java虚拟机》第三版
    2. 漫画:什么是JVM的垃圾回收?
      • 非常简单易懂,十分推荐
    3. bugstack虫洞栈——面经#27
      • 实例查看回收过程

    10. 实例验证GC

    老是说GC,如何看到GC运行的实际效果?TALK IS CHEAP,SHOW ME THE CODE

    举个例子:(例子来源:bugstack虫洞栈——面经#27

    测试代码:

    public class ReferenceCountingGC {
        public Object instance = null;
        private static final int _1MB = 1024 * 1024;
        /**
         * 这个成员属性的唯一意义就是占点内存, 以便能在GC日志中看清楚是否有回收过
         */
        private byte[] bigSize = new byte[2 * _1MB];
        public static void main(String[] args) throws InterruptedException {
            testGC();
        }
        public static void testGC() throws InterruptedException {
            ReferenceCountingGC objA = new ReferenceCountingGC();
            ReferenceCountingGC objB = new ReferenceCountingGC();
            objA.instance = objB;
            objB.instance = objA;
            objA = null;
            objB = null;
            // 假设在这行发生GC, objA和objB是否能被回收?
            //这里我们先采用 jvm 工具指令,jstat来监控。因为监控的过程需要我手敲代码,比较耗时,所以我们在调用testGC()前,睡眠会
            //  Thread.sleep(10000);
            System.gc();
        }
    }
    

    在启动的程序中,加入GC打印参数,观察GC变化结果。

    -XX:+PrintGCDetails  #打印每次gc的回收情况 程序运行结束后打印堆空间内存信息(包含内存溢出的情况)
    -XX:+PrintHeapAtGC  #打印每次gc前后的内存情况
    -XX:+PrintGCTimeStamps #打印每次gc的间隔的时间戳 full gc为每次对新生代老年代以及整个空间做统一的回收 系统中应该尽量避免
    -XX:+TraceClassLoading  #打印类加载情况
    -XX:+PrintClassHistogram #打印每个类的实例的内存占用情况
    -Xloggc:/Users/xiaofuge/Desktop/logs/log.log  #配合上面的使用将上面的日志打印到指定文件
    -XX:HeapDumpOnOutOfMemoryError #发生内存溢出将堆信息转存起来 以便分析
    

    在这里插入图片描述

    • -XX:+PrintGCDetails

      [GC (System.gc()) [PSYoungGen: 6717K->712K(37888K)] 6717K->720K(123904K), 0.0020003 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
      [Full GC (System.gc()) [PSYoungGen: 712K->0K(37888K)] [ParOldGen: 8K->590K(86016K)] 720K->590K(123904K), [Metaspace: 3105K->3105K(1056768K)], 0.0048082 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] 
      Heap
       PSYoungGen     total 37888K, used 983K [0x00000000d6200000, 0x00000000d8c00000, 0x0000000100000000)
        eden space       32768K,   3% used [0x00000000d6200000,0x00000000d62f5db8,0x00000000d8200000)
        from space       5120K,    0% used [0x00000000d8200000,0x00000000d8200000,0x00000000d8700000)
        to  space        5120K,    0% used [0x00000000d8700000,0x00000000d8700000,0x00000000d8c00000)
       ParOldGen      total 86016K, used 590K [0x0000000082600000, 0x0000000087a00000, 0x00000000d6200000)
        obje space       86016K,   0% used [0x0000000082600000,0x0000000082693820,0x0000000087a00000)
       Metaspace       used 3128K, capacity 4496K, committed 4864K, reserved 1056768K
        class space    used 343K,   capacity 388K, committed 512K, reserved 1048576K
      
      • 怎么看结果?
        • PSYoungGen:GC日志中的PSYoungGen(PS是指Parallel Scavenge)为Eden+FromSpace,而整个YoungGeneration为Eden+FromSpace+ToSpace。
        • ParOldGen:ParOldGen表示gc回收前后老年代的内存变化
        • MetaSpace:JDK1.7中,存储在永久代的部分数据就已经转移到了Java Heap或者是 Native Heap。但永久代仍存在于JDK1.7中,并没完全移除,譬如符号引用(Symbols)转移到了native heap;字面量(interned strings)转移到了java heap;类的静态变量(class statics)转移到了java heap。
      • 从运行结果可以看出内存回收日志,Full GC 进行了回收。
      • 也可以看出JVM并不是依赖引用计数器的方式,判断对象是否存活。否则他们就不会被回收啦

    11. GC主要算法

    漫画:什么是JVM的垃圾回收?

    • 如何判断哪些垃圾是需要回收的?
    • 有哪些重要的垃圾回收算法?

    接下来一个个进行回答:这些问题的关键其实就是有关GC的四大算法

    11.1 如何判断哪些垃圾是需要回收的:

    引用计数算法

    定义

    • 它通过记录对象被引用的次数从而判断该对象的重要程度;
      • 如果该对象被其它对象引用,则它的引用计数加一,
      • 如果删除对该对象的引用,那么它的引用计数就减一,
      • 当该对象的引用计数为0时,那么该对象就会被回收。

    评价

    • 从实现来看,引用计数器法(Reference Counting)虽然占用了一些额外的内存空间来进行计数,但是它的实现方案简单,判断效率高,是一个不错的算法。
      • 也有一些比较出名的引用案例,比如:微软COM(Component Object Model) 技术、使用ActionScript 3的FlashPlayer、 Python语言等。
    • 但是,在主流的Java虚拟机中并没有选用引用技术算法来管理内存,主要是因为这个简单的计数方式在处理一些相互依赖、循环引用等就会非常复杂。可能会存在不再使用但又不能回收的内存,造成内存泄漏
    • 所以,Java虚拟机采用的是另一种方法来判断对象是否存活,它就是可达性分析算法。

    可达性分析算法

    Java、C#等主流语言的内存管理子系统,都是通过可达性分析(Reachability Analysis)算法来判定对象是否存活的。

    定义

    • 首先要确定一系列根对象(GC Roots),并从根对象为起点根据对象之间的引用关系搜索出一条引用链(Reference Chain)
    • 在引用链的对象就存活,而不在引用链的对象就认定为可回收对象。

    程序员小灰举了个十分生动的例子:

    有一个比喻十分恰当:可达性分析算法就好比是在清洗葡萄串,我们可以从一根枝提起一大串葡萄,他们就像一串引用链,而没有和引用链相连的对象就像是散落在池子里的葡萄,可以回收。

    根对象(GC Roots)

    • 全局性引用,对方法区的静态对象、常量对象的引用

      1. 虚拟机栈中引用的对象(正在运行的方法使用到的变量、参数等)
      2. 方法区中类静态属性引用的对象(static关键字声明的字段)
      3. 方法区中常量引用的对象,(也就是final关键字声明的字段)
    • 执行上下文,对 Java方法栈帧中的局部对象引用、对 JNI handles 对象引用

      1. 本地方法栈中引用的对象(native方法)
      2. Java虚拟机内部的引用。(系统内部的东西当然能作为根了)
    • 已启动且未停止的 Java 线程

    11.2 如何进行垃圾回收:

    判断了内存种哪些垃圾需要被回收之后接下来就要通知JVM进行垃圾回收了,在此我们会了解到几个重要的回收算法,”标记-*算法“(可以说十分见名之意了)

    下列图源:bugstack虫洞栈——面经#27《JVM 判断对象已死,实践验证GC回收》

    标记-清除算法(mark-sweep)

    在这里插入图片描述

    如图:简单来说,就是用可达性算法判断出哪些垃圾,并就地释放。

    要点:

    1. 需要注意的是:所谓的清除,并不需要真正地把整个内存的字节进行清零操作,只需要把空闲对象的起始结束地址记录下来放入空闲列表里,表示这段内存是空闲的就行。

    2. 优缺点:

      1. 优点:速度快,只需要做个标记就能知道哪一块需要被回收,但是他的缺点也是致命的。

      2. 缺点

        1. 一是执行效率不稳定,

        2. 二是会涉及到内存碎片化的问题,如下图,有空间但是不连续导致无法存入,造成内存浪费

          在这里插入图片描述

    所谓标记复制算法和标记整理算法,都是对标记清除算法缺点的改进,所以才说标记清除算法是最基础的方式。

    标记-整理算法(mark-compact))

    在这里插入图片描述

    如图:简单来说,用可达性算法找出需要回收的垃圾,回收并释放空间后把空间整理为连续存储的内存空间。

    要点:

    • 1974年,Edward Lueders 提出了标记-压缩算法,标记的过程和标记清除算法一样,但在后续对象清理步骤中,先把存活对象都向内存空间一端移动,然后在清理掉其他内存空间。
    • 这种算法能够解决内存碎片化问题,但压缩算法的性能开销也不小。效率就低了。
    • 标记-整理算法 不仅可以弥补 标记-清除算法当中,内存区域分散的缺点,也消除了复制算法当中,内存减半的高额代价;

    标记-复制算法(mark-copy)

    在这里插入图片描述

    如图:简单来说,用可达性算法找出需要回收的垃圾后,把非垃圾资源连续复制至to空间,实现资源释放。

    要点:

    • 这种方式是把内存区域分成两份,分别用两个指针 from 和 to 维护,并且只使用 from 指针指向的内存区域分配内存。
    • 当发生垃圾回收时,则把存活对象复制到 to 指针指向的内存区域,并交换 from 与 to 指针。
    • 它的好处很明显,就是解决内存碎片化问题。但也带来了其他问题,堆空间浪费了一半。

    面试题:如何判断哪个是to区呢?一句话:谁空谁是to

    12.进行垃圾回收

    以上算法并不是单兵作战,而是会在JVM里分代协同回收。

    漫画:什么是JVM的垃圾回收?

    在这里插入图片描述

    上图所示,就是Java堆内存的划分。为什么需要这么划分区域呢?那是因为我们的java对象寿命都是不同的,有的可能需要长时间使用,而有的可能用完就可以丢去。于是我们可以根据其生命周期的不同特点,进行不同的垃圾回收策略。

    总的来说,新生代的垃圾回收比较频繁,老年代很久才触发一次垃圾回收。
    新生代处理的都是一些朝生夕死的对象,而老年代回收的是更有价值的,会长时间存活的对象。

    举个很好理解的例子:新生代处理垃圾,就像是处理生活日用垃圾,而老年代处理的垃圾,更像是过年大扫除,家里实在太多垃圾了来一次重清理。大扫除清理的垃圾,都是在家中存放时间较长的,往往可能曾经很受用,如今退役了先放着过年再打扫清除掉。

    大致步骤:

    首先等新生代的伊甸园区满了之后用Minor GC进行垃圾回收,筛选一部分资源进入老年代

    等老年去空间满了之后,触发Full GC进行垃圾回收

    • 新生代:

      • 年轻代中使用的是Minor GC,采用的就是复制算法(mark-copy)

      在这里插入图片描述

      Minor GC 会把Eden中的所有活的对象都移到Survivor区域中,如果Survivor区中放不下,那么剩下的活的对象就被移动到Old generation中,也就是说,一旦收集后,Eden就是变成空的了

      • 当对象在Eden(包括一个Survivor区域,这里假设是From区域)出生后,在经过一次Minor GC后,如果对象还存活,并且能够被另外一块Survivor区域所容纳

        • (上面已经假设为from区域,这里应为to区域,即to区域有足够的内存空间来存储Eden 和 From 区域中存活的对象),
        • 则使用复制算法将这些仍然还活着的对象复制到另外一块Survivor区域(即 to 区域)中,然后清理所使用过的Eden 以及Survivor 区域(即form区域),并且将这些对象的年龄设置为1,
        • 以后对象在Survivor区,每熬过一次MinorGC,就将这个对象的年龄 + 1,当这个对象的年龄达到某一个值的时候(默认是15岁,通过- XX:MaxTenuringThreshold 设定参数)这些对象就会成为老年代。

        在这里插入图片描述

      -XX:MaxTenuringThreshold 任期门槛=>设置对象在新生代中存活的次数

      面试题:如何判断哪个是to区呢?一句话:谁空谁是to

    • 老年代:

      • 老年代使用的是Full GC,采用的是清除(sweep)与整理(compact)算法
        • 在整理压缩阶段,不再对标记的对象作回收,而是通过所有存活对象都像一端移动,然后直接清除边界 以外的内存。可以看到,标记的存活对象将会被整理,按照内存地址依次排列,而未被标记的内存会被 清理掉,如此一来,当我们需要给新对象分配内存时,JVM只需要持有一个内存的起始地址即可,这比 维护一个空闲列表显然少了许多开销。
        • 标记、整理算法不仅可以弥补 标记、清除算法当中,内存区域分散的缺点,也消除了复制算法当中,内存减半的高额代价;

    小结:

    • 内存效率:

      • 复制算法 > 标记清除算法 > 标记压缩算法 (时间复杂度)
    • 内存整齐度:

      • 复制算法 = 标记压缩算法 > 标记清除算法
    • 内存利用率:

      • 标记压缩算法 = 标记清除算法 > 复制算法

    可以看出,效率上来说,复制算法是当之无愧的老大,但是却浪费了太多内存,而为了尽量兼顾上面所 提到的三个指标,标记压缩算法相对来说更平滑一些 , 但是效率上依然不尽如人意,它比复制算法多了一个标记的阶段,又比标记清除多了一个整理内存的过程。

    难道就没有一种最优算法吗?猜猜看,下面还有

    答案 : 无,没有最好的算法,只有最合适的算法 。

    分代收集算法👍

    年轻代:(Young Gen)

    年轻代特点是区域相对老年代较小,对象存活低。

    这种情况复制算法的回收整理,速度是最快的。
    复制算法的效率只和当前存活对象大小有关,因而很适 用于年轻代的回收。而复制算法内存利用率不高的问题,通过hotspot中的两个survivor的设计得到缓解。

    老年代:(Tenure Gen)

    老年代的特点是区域较大,对象存活率高!

    这种情况,存在大量存活率高的对象,复制算法明显变得不合适。
    一般是由标记清除或者是标记清除与标记整理的混合实现。Mark阶段的开销与存活对象的数量成正比,这点来说,对于老年代,标记清除或 者标记整理有一些不符,但可以通过多核多线程利用,对并发,并行的形式提标记效率。Sweep阶段的 开销与所管理里区域的大小相关,但Sweep “就地处决” 的 特点,回收的过程没有对象的移动。使其相对其他有对象移动步骤的回收算法,仍然是是效率最好的,但是需要解决内存碎片的问题。

    展开全文
  • 市面上以及网络搜索中都基本很少有成体系的关于字节码编程的知识,这主要由于大部分开发人员其实很少接触这部分内容,包括;ASM、Javassist、Byte-buddy以及JavaAgent,没有很大的市场也就没有很多的资料。...
  • 这是一本互联网真实案例实践书籍。以落地解决方案为核心,从实际业务中抽离出,交易、营销、秒杀、中间件、源码等22个真实场景,来学习设计模式的运用。 适合人群 1. 具备一定编程基础在工作1-3年的研发人员 ...
  • 博客:https://bugstack.cn 沉淀、分享、成长,让自己和他人都能有所收获!???? 一、前言 20万行代码写完,毕业了找一份工作不是问题! 刚一毕业因为找不到工作,就得报名去参加Java培训的大有人在。并不是说参加...


    作者:小傅哥
    博客:https://bugstack.cn

    沉淀、分享、成长,让自己和他人都能有所收获!😄

    一、前言

    20万行代码写完,毕业了找一份工作不是问题!

    刚一毕业因为找不到工作,就得报名去参加Java培训的大有人在。并不是说参加培训就不好,只不过以你现在这个毕业的时间点参加,就会显得特别匆忙。因为你的压力既来自于培训还需要花家里一笔不小的费用,也有同班同学已经找到一份不错的工作开始赚钱的比对。

    大学四年其实有足够的时间让你学会编程,也能从一个较长时间的学习中,知道自己适合不适合做程序员。就像我的同学里虽然都是计算机或者软件工程专业,但毕业后并没有都从事软件开发工作,或者从事了一段时间发现并不适合这个行业而选择到其他领域发展。

    所以如果你是真的喜欢编程,那么在这个行业里工作你会很开心,如果不是那么往后路还长,你所要面对的晋升加薪跳槽都可能成为一道道障碍。目前可能你还是新人不了解自己是否喜欢编程开发,那么可以在以后的学习中体会,自己是否愿意为一个运行结果调来调去,辗转不寐的研究分析,只为最后那一个运行通过而激动!

    当你可以在激动和开心中写完20万行代码,对于毕业后的求职找工作来说几乎可以叫你一声面霸,也可能你在实习时就被公司直接留下,这是个人才组织需要你!

    20万行代码看上去很多,但放在4年的大学学习中并不会有多难。平均每天200行,一个月是6000行,一年算10个月是6万行,三年就有18万行。这20万行代码会把你从一个编程小白,带入到熟练使用Java相关API,也能给你带入到初级工程师的水平。

    初学编程你可能想把一句代码完整敲下来都不容易,就更不用说运行出结果了。因此此时你的大脑和手还并不能迅速理解你眼睛里看到的这一行行代码都是啥,要干啥。这就像新买回来的钢琴手指头上去摸肯定是生硬的,敲出的声音也不连贯。这个阶段只能是照着例子大量的写,度过一个熟练期才能更好的学习。

    为了可以让更多的小伙伴理解这件事,我会从我的在校培训外包跳槽阶段成长以及找什么样的工作分享给大家作为参考,最后再把我整理出资料一并分享给大家。

    二、经历

    12年10月25日,在CSDN发的一个帖子 拿到两个offer,一个7k,一个转正税后4.5k。求意见! 距离现在它已经过去好久了,当时也是因为拿到了两份offer的选择纠结,所以发了个帖子求问。好气的是当时竟然不知道去面试面试互联网公司,信息太闭塞了,而且培训的地方并没有说过互联网一些公司的信息。

    讲一讲我这7k的经历;

    1. 12年07月,校企合作来北京昌平一个小县城的地方参加中软培训
    2. 12年10月,培训接近尾声,开始找工作,月薪7k的中软就是最后的选择的地方,放弃了在北航院内的国家科技
    3. 12年12月,虽然拿到中软Offer但迟迟不让入职,电话联系了很多次我说可以先去实习,但都说等通知。没办法,在北京也不可能就硬待着,回家的话也麻烦行李、住宿都得折腾,所以又面了一家中科软进去实习了三个月,赚点钱养活自己
    4. 13年03月,中软的通知终于来了,但竟然是参加岗前培训,又被培训了一次,当时特别讨厌培训,每次都是讲Java基础,差点生气怼老师
    5. 13年09月,在中软正式转正,也就是说培训完又是实习,7月份毕业后9月份才入职为正式员工,心里有点不爽,埋下了一个后续跳槽的种子。哪有实习这么久的!
    6. 15年04月,第一次有跳槽准备,毕竟写了两年的C#写够了,面试了第一家互联网公司,乐视致新,不过后来没去,被公司留了下来
    7. 15年08月,之前谈的留下来涨薪,但最后少涨了1千块钱。所以继续面试,还算顺利面了两家,最后在8月25日跳槽进互联网完成。

    以上整个过程就是我从学校实习找工作以及最后跳槽的一个阶段性经历,也有过在这条路上跌跌撞撞。就像;

    • 虽然我面到了中软管培生,但错失没选择要北京户口,而是要了400块房补
    • 在中软9月份从实习转正式员工,错过了第二年的入职满一年才涨薪的条件(但我觉得这个有点故意坑了)
    • 明明是学了那么多Java,但却写了两年C#,大家还是要选择自己喜欢的语言进行工作,否则会很麻烦
    • 提了离职,基本就不要想着再留下来,无论什么条件。哪怕钱和职位满足了,心里也有隔阂以及个人对没经历过事情的一个期许
    • 从传统外包跳槽的互联网,并不那么容易,技术使用的不同、开发场景的不同、组织关系的不同,一切都可能是从一个较低的位置重新开始。你需要自身技术不错,也需要一个好人带
    • 但当时在的传统也有不错的点,比如可以5:30下班,带我的经理人很不错,公司也不那么累,有时候还可以出差溜达溜达。

    三、学习

    一个大学生会经历在校、实习、就业几个阶段,其中在校学习属于蓄力阶段,要学习很多知识才能支撑起来将来的实习和平稳就业。

    蓄力阶段的学习,主要是对编程技术的基础的夯实,以及多学习与数学相关的内容,比如;数据结构、算法逻辑,这些知识对将来在技术上的提升和造诣都是非常好的基石。下面就是整个大学过程中在编程学习过程中需要经历的阶段,如图;

    • 熟悉工具:初学编程后你大概会接触到一系列的研发工具,包括IDEA、Eclipse、Navicat、Maven、Git、Tortoise、SourceTree、Visio、Xmind等等,工具的熟练会让编程更流畅。
    • 编写代码:此时你需要大量写代码,写很多的代码,因为你几乎就是需要靠写代码把整个所学的编程语言熟练使用起来。总不能手生到写完 public,写不出来 class,这跟我不会弹钢琴一样,敲完了1,后面不知道要在哪找下一个音符♪了。
    • 功能开发:小的功能开发是综合锻炼技术使用的阶段,比如做一个计算器、求一个水仙数、从一篇html中摘取你要的信息等等。此段经历会解决你之前感觉学完技术没出用的痛苦,现在你可以想象出各种场景问题,之后用代码去处理。还可以帮助英语系的小师妹,把她需要背的单词从网站中爬取下来,汇总出各类热词、语句、摘要等
    • 项目开发:小功能练手后,接下来你就可以做做项目了。比如你常听到的图书管理系统、教师教学管理系统等等。如果觉得没有意思,你可以从哪里获取项目呢?从你用到的各类APP中,把这里用的功能简化,之后做一些项目开发。比如一个简单的商城、抽奖、全物流单号查询。另外你还可以在github中查找一些项目,去参考学习并自己动手实践。
    • 数据结构:可能初学编程并不会对数据结构有多少思考,也想象不到这类内容是用在哪的。但其实这类技术内容早已被你天天使用,例如:LinkedList、ArrayList、HashMap,这里就包括了数组链表队列散列表等各项数据结构,当你将来要开发一些较大型的互联网应用程序时,你所有的逻辑设计都会考虑到数据要如何存放,数据结构如何设计才能更合理的被程序使用。
    • 算法逻辑:学完数据结构接下来要做的就是对算法逻辑的学习,这里不仅仅是简单的刷题,而是在数据结构的上使用算法将数据更合理的存放和读取以及做相应的操作。就像你能逐步了解的;排序、二分、旋转、洗牌等等,以及将来还会在阅读JDK源码中会看到,扰动函数、负载因子、拉链寻址、开放寻址、哈希散列、除法散列法、平方散列法、斐波那契(Fibonacci)散列法等等。
    • 设计模式:当你开发了很多很多程序代码以后,你会逐步的思考怎么才能让这些代码有可复用性呢,怎么写才能让更多人读懂呢、怎么实现才能让再接需求时能更快的承接呢。这些都会随着你开始实习真正接触到公司级的代码开始逐步的感受到的,写代码不是一锤子买卖,也不是炫耀技术,当你有更宽的视野范围时,就会思考的更多。这里推荐阅读《重学Java设计模式》 这是一本基于互联网真实案例编写的Java设计模式实践图书。全书以解决方案为核心,从实际开发业务中抽离出交易、营销、规则引擎、中间件、框架源码等22个真实场景,对设计模式进行全面、彻底的分析。帮助读者灵活地使用各种设计模式,从容应对复杂变化的业务需求,编写出易维护、可扩展的代码结构。

    以我个人经历和经验来看,想搞定这些学习范围和内容,最大的动力是来自于对编程的热爱和折腾。就像我这样做过很多土项目,如下;

    • 串口通信、在线考试、考试抽题、彩礼管理、成绩管理、即时聊天、计算器还有后来折腾过的仿微信聊天,这些项目都可以不断的夯实个人的技术能力,每一次做新的一个项目都会把之前所遇到的问题,又考虑新的实现方式再折腾一遍。
    • 编程的学习中重要的并不是结果,而是在这个过程中经历了什么。哪怕是犯了很多的错也没关系,因为每一次犯错都是学习的机会,都可以找到更多的资料,每一个资料里又可能教会你其他的知识。

    四、就业

    不只是我,可能很多在上学阶段并不知道都是做Java开发,就业的企业也分为传统行业、国企、半国企、外包、外企、互联网等这么多类型,尤其是我这样在13年毕业的时候,既没有所谓的就业指导,也没有有经验的朋友了解,就只能跟着大家走。好在现在大家可以在互联网中获取到这些信息,也就能早早的帮助毕业同学进行择业。

    1. 传统行业

    • 难度:⭐⭐
    • 公司:金蝶、用友
    • 发展:在传统行业方面有较强的技术积累和产品沉淀,一般其他公司也都有传统行业研发的产品。另外现在的传统行业逐步包括了互联网的领域开发以及技术使用,只不过会比纯互联网少一些高并发场景,因为大部分这类软件面对的并不是C端人群。所以个人进入此类公司会相对比较稳定,但如果后期想再跳槽比较麻烦,会出现技术断层。

    2. 国企&半国企

    • 难度:⭐⭐⭐
    • 公司:联想、京东方、中软国际、国家电网
    • 发展:早前应届生入职国企或者半国企一般会有解决北京户口,但现在可能名额不断的减少了。像中软有一部分自己做的东西,也有一部分是承接外包的内容。此类公司做的工作内容可能比较单一,有时候一个项目会用很多年,但同时可能不会太忙,有一些自己的时间,并且像联想、国家电网福利待遇也都不错。

    3. 外包

    • 难度:⭐⭐⭐
    • 公司:对日外包、企业外包
    • 发展:像是在大连会有一些专门的对日外包企业,还可能需要长期在日本出差。我的两个同学上学时候日语都学的不错,现在一直在日本工作,就他们来说挺习惯在外面的生活了。还有一部分外包是企业外包,比如你入职一个外包公司,可能会把你这个人外派给华为、腾讯、阿里等公司,开发他们外包出来的工作,此类工作一般相对来说短期、非核心。但干的好的也有转正机会,直接入职大厂,不过比较难。而且外包到企业里的人员,没有正式员工的待遇

    4. 外企

    • 难度:⭐⭐⭐⭐
    • 公司:亚马逊、谷歌、微软
    • 发展:外企工作还是挺香的,相对来说没有那么强的加班,福利待遇也比较不错。例如像这类的公司会明确写上不加班,以及各种假期和旅游。但可能是近几年被国内互联网挤压的,也有一些在国内的外企有裁员的动作。

    5. 互联网

    • 难度:⭐⭐⭐⭐⭐
    • 公司:百度、阿里、腾讯、字节、京东、美团、滴滴等等
    • 发展:这类公司在北上广就多了去了,虽然多但面试难度仍然不低,尤其是现在内卷的情况下,需要你会很多知识以及数据结构或者刷算法,才可能找到一份不错的工作。此类的公司的薪资待遇不错,每年都水涨船高,可能一个刚毕业的重点大学,大学生,入职的薪资就要倒挂各类老员工了。除了有少许的内卷,其他的还是挺不错的。

    6. 出国

    • 难度:⭐⭐⭐⭐⭐
    • 公司:加拿大的 shopee、美国的脸书、谷歌、苹果等等
    • 发展:如果喜欢国外的生活,又有出去的本事,那也是一个非常好的选择。像小傅哥熟悉的一个北大的伙伴,入职到了加拿大的 shopee,收入以及整个生活节奏对他来说还是非常满意的。

    以上就是各类公司的一个简单介绍,每一个人就业时都会有自己的选择,比如想安稳些、想要户口、想要高工资、想不那么加班等等,只要你能对自己的选择负责,合理规划好自己的职业发展,那么就可以了。

    五、资料

    1. 技术内容

    其实现在互联网的文档、资料、书籍、视频都已经很多了,但也可能正因为太多了,让初学编程的人找不到所处阶段,大一、大二、大三、大四以及毕业了工作了几年后,都应该找什么样的资料学习。

    所以我这里把各类资料进行整合,按照不同阶段的学习范围把资料分到不同的文件夹去,方便所处不同阶段的读者可以有一个相对准确的学习范围。

    2. 实战内容

    如果你已经跨过了初级阶段,需要做一些实践型的项目,可以关注下我的Github,如下:

    • 内容:本代码库是作者小傅哥多年从事一线互联网Java开发的学习历程技术汇总,旨在为大家提供一个清晰详细的学习教程,侧重点更倾向编写Java核心内容。这部分资料也是我所写博客中实践项目的源码,在这里你可以学到Netty、字节码编程、设计模式、领域驱动设计、规则引擎、面试、架构以及职场经历的分享。
    • 地址https://github.com/fuzhengwei/CodeGuide/wiki

    六、总结

    • 如果一个大学生不怎么关注技术博客,也不知道有哪些技术博客,那么大概率你基本不会了解到你要学什么技术,也没有渠道可以让你拓展自己的知识面。并且尤其是在现在的软件基于人群喜好推荐下,你知道的越少的东西,就越少知道这个东西。所以主动有意识的学习,几乎是你个人成长最快的方式。
    • 做一件事,就把一件事做好!认认真真的长期坚持下来,你会在所走的路上收获很多,千万不要急于求成,否则你能获得的只是微乎其微。当你有一天真的要拿手里的这几张牌,出去闯荡的时候,会被人家炸哭。
    • 另外在大学里进来不要去做一些不会给自身带来长久价值的兼职工作,如果你真的缺那份钱另说,否则尽可能把这些时间用在你将来要找的工作所需的知识学习上。时间不多,做有价值的事更有益个人成长。
    • 酒香不怕巷子深,放在现在是几乎就是不可能的。因为酒不在是你一家酒了,谁能曝光的更多,宣传的更足,展示的更好,谁就更有机会可能成为佼佼者。否则站在台上那个不一定比你强的人,却可能比你过的更好。

    七、系列推荐

    展开全文
  • 博客:https://bugstack.cn 沉淀、分享、成长,让自己和他人都能有所收获! 一、前言 标题想吸引你进来参考下我的学习方式,或许能给你带来一些经验。当然不乏一些培训中也有超级优秀的开发人员。 讲道理,程序员...


    作者:小傅哥
    博客:https://bugstack.cn

    沉淀、分享、成长,让自己和他人都能有所收获!

    一、前言

    标题想吸引你进来参考下我的学习方式,或许能给你带来一些经验。当然不乏一些培训中也有超级优秀的开发人员。

    讲道理,程序员上学这段时光相对每个人都是公平的。同样是拿到了一本 谭浩强 的《Java 2 实用教程》,也同样有一台笔记本电脑,和一个宿舍一张床。

    那些年的男生宿舍

    说说我自己,刚上大一编程方面的课程是C语言,先不说能不能运行出来 HelloWorld ,就连安装个 VC++ 6.0 ,都折腾好几天。可能也是神奇,因为萌新小白学习东西能遇到各种各样的问题。 最后安装好了软件的电脑真的不敢乱弄,怕它坏。C语言 学了一个学期后开始了 Java 课程,大家都说 Java 简单,巴拉巴拉 有很多函数、开发工具好用、内存自己回收等等。但确实,工具还是蛮好安装的,除了配置环境变量要去网上抄一下,还是可以写出一个 Hi Java 的。从此便开始了 Java 学习的旅途。

    从你摸起电脑的那一刻,每个人学习编程都会遇到很多问题,包括;

    1. 完全不知道是啥,不知道从哪开始,老师讲过也不会。
    2. 多次碰壁运行不出结果,带不来成就感。没有游戏和隔壁系的妹子好。
    3. 学完就忘,背了也记不住,觉得自己也没有项目,不能锻炼。
    4. 能交流的人少,身边也是打游戏的多,大学校园花花绿绿,有钱没钱,我也想玩玩。

    除了这些问题,可能比这些多的还有很多问题。我也同样遇到过,初学时我也去加一些QQ群,但是很多都是比较水,能讨论技术的不多。也看过一些技术论坛,确实还是有引导性的帮助的。也跟一些师哥师姐交流,大学学哪些知识才能找到工作。好在,慢慢摸索出一条学习路线。同时为了可以与同好共同学习,就自己建了技术QQ群(东软帝国),认识了一群好友,在我大学期间时常给我解决bug;大帝糖糖苏二毛蚂蚁ZERO小凯Ticmy大宝萌货等众多好友。他们现在也分布在BAT等一线互联网的中,也有做到总监级别的大佬。

    给自己打打气,有时候真的需要给自己点激励,毕竟这条路走起来不是那么容易。我的方式是上学期间时常会写一些自己认为算事诗句的诗,来提升自己的斗志。

    红尘世界几个王,我自不服迎头上。
    日敲代码两百行,冲进世界五百强。
    

    如果你在网上搜这几句话,还是可以搜的到的!

    学习编程的过程很大一个问题是写的少,总有一部分人觉得只要看了视频,背了代码,这东西就能会。但往往真的不是这样,只要这东西不是你亲手敲了几十遍,你就永远也记不住。因为这个过程是在锻炼你的逻辑思维和肌肉记忆,为啥说是肌肉记忆呢?就像你打字聊天,输入一个拼音nihao,你会现在会想到它是从哪个手指敲出去的吗?根本就不会了,肌肉记忆早已形成,你只需要把你要的内容想到就能立刻通过键盘呈现出来。同样写代码也是也有的,public static void main,如果这一句代码你要反复看着键盘去敲,那么就是你写的代码量还是太少。

    愿努力拼搏的你都能承载一份美好!

    二、初学编程用过的书

    嗯!是用过的书,不是看过的书。

    初学编程的人往往并不需要太多的书,因为一本书所涵盖的知识基本已经很全面了,难的是要一字一句的把里面的内容都搞定。如果只是看还是很容易的,但是要想按照里面说的都实现运行出结果,那对收获来说就不不一样了。当然,如果你已经深入的学习了,领悟性有很好。可以在继续扩展其他书籍的学习,包括一些深入的原理、源码的分析、技能的拓展等等。

    1. 谭浩强的这本书看了好久

    谭浩强《Java 2 实用教程》

    一遍遍翻,一遍遍看,一遍遍运行里面的代码。这本书真的给我带来很大的帮助,时至今日它也一直在我的身边。

    2. SSH 几百页的书翻烂了

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pqZx01xk-1588258242775)(https://bugstack.cn/assets/images/2020/itstack-code-life-04-03.png)]

    学习完基础编程后,就需要去拓展Spring相关技能,去开发真正的项目。类似这样的书还是比较多的,书中也包括了一些项目可以跟着学习。

    3. 除了书还有视频可以看

    似乎每个程序员都看过 马士兵 的视频,主要是他的声音和讲课方式很吸引人,不沉闷又能学的干货。至少他的视频我是看了5-6遍,也跟着写了5-6遍。

    三、同样的项目做了N遍

    在学习编程的过程中,我搞过很多的项目,当然这些项目的需求很多都是我臆想出来的。通过我需要锻炼什么样的知识点,之后去想着大概一个什么样的项目可以涵盖的去练习,如果你目前也是这样没有什么项目,那么也是可以这样去自己造需求。

    当!学到 Socket 后,大家应该都做过局域网聊天,而我比较能折腾做了N次。直到最后这次模仿微信聊天项目,不仅自己得到锻炼,还可以通过我的代码帮助别人成长。

    1. 上学期间第一个仿QQ聊天

    登录

    仿QQ聊天,登录

    好友

    仿QQ聊天,好友

    聊天

    聊天

    • 这个期间是学校聘请了外部的老师来教我们做项目,为了尽可能做的好一点,当时就研究着仿照QQ做一款通信。现在看还是比较丑的,但是当时也是比较牛的了。往往就是这样一点点的努力,在一个很长时间的捶打中获得成就感,不断的刺激着学习的动力。

    2. 培训期间局域网聊天

    登录

    局域网通信,登录

    聊天

    局域网通信,聊天

    控制台

    局域网通信,控制台

    • 清楚的记得这是当时搞了一周写完的,毕竟这样的工程还是比较熟练了。
    • 甚至我在考虑把好友与聊天窗口合并,貌似现在大部分聊天软件也都是这么干的了!嗯!优秀!
    • 同时这个项目的完成,也让我后来找工作能一面就通过,还是当时工资最高的仔。

    3. 学Netty5.0写局域网聊天

    登录

    Netty5.0通信,登录

    聊天

    Netty5.0通信,聊天

    4. 学WebSocket仿微信聊天

    聊天

    WebSocket通信,聊天

    5. 出专栏仿桌面版微信

    登录

    Netty仿桌面版微信,登录

    聊天

    Netty仿桌面版微信,聊天

    好友

    Netty仿桌面版微信,好友

    • 这个项目是20年过年期间发起的,使用JavaFx、Netty4.x、SpringBoot、Mysql等技术栈和偏向于DDD- 领域驱动设计方式,搭建的仿桌面版微信聊天工程实现通信核心功能。
    • 整体的工程已经非常贴近微信,工程代码实现上也更加清晰明了,架构代码分层也显得老练了许多。如果是新人看这份代码,确实能带来很大的成长。
    • 源码地址:https://github.com/fuzhengwei/NaiveChat

    6. 除了这些还搞过很多

    只要是能学习编程的内容,我似乎一直在折腾。谁学习期间也没有一个项目,但是可以自己去想出来一个项目,之后通过这样的项目锻炼自己的知识,尽可能让学到的内容得以实践。下面在列举一些大学期间自己练习的项目;

    1. 分数计算机

    计算器

    2. 学生成绩管理系统

    成绩系统

    3. 考试题库系统

    考试题库系统

    4. 图书馆系统

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ab4I6eJI-1588258242803)(https://bugstack.cn/assets/images/2020/itstack-code-life-04-16-04.png)]

    5. 彩礼管理系统

    彩礼管理系统

    6. 在线考试系统

    在线考试系统

    好在当年留了一些图片

    虽然这些系统在现在看有点点丑,甚至算不上项目,但对于编码从初识到了解的一个学习过程是需要的。总归,是要做一些实际的目标性内容,引导自己不断地强化知识。把一些未知的知识尽可能通过问题诉求学习到。

    四、沉淀、分享,交个朋友

    从19年开始,我想着生活里要添加一点自己能长期坚持的事情,不要把时间都浪费掉。于是,选择了我最擅长的方向,做原创技术输出。这样既能让自己有所沉淀,也能把知识传播给他人带来成长。

    • 2019年7月,搭建个人博客;https://bugstack.cn - 沉淀、分享、成长,让自己和他人都能有所收获

    • 2019年8月,找回公众号bugstack虫洞栈,定期推送个人原创技术文章。

    • 2019年9月,CSDN 申请博客专家通过。

    • 2019年10月,微信公众号终于有了1k的读者。

    • 2019年11月,完成四个专栏内容编写;《用Java实现JVM》《Netty4.x专栏学习》《基于JavaAgent全链路监控》《DDD领域驱动设计实践》

    • 2019年12月,开发微信公众号与博客打通引流粉丝。

    • 2020年,还在进行中!发布了GitChat专栏深入编写了字节码编程持续做原创技术输出加强个人技术栈学习吸纳架构设计精髓等等。

    • 整理了一整套CodeGuide 程序员编码指南 - https://github.com/fuzhengwei/CodeGuide/wiki

      本代码库是作者小傅哥多年从事一线互联网 Java 开发的学习历程技术汇总,旨在为大家提供一个清晰详细的学习教程,侧重点更倾向编写Java核心内容。如果本仓库能为您提供帮助,请给予支持(关注、点赞、分享)!


    做这些事情,更多是我的爱好爱折腾的性格在支撑我。也希望将我的编程学习经验和技术沉淀多多分享。

    其实大家可支配的时间都差不多,只不过开始写技术文章后,不吃鸡、不王者、不去电影、夜里0点前不睡觉也有2点的时候、周末放假不出去浪(今年也出不去)。那么你还是可以做一些有意义的事。当然,如果你说这样不是生活,但每个人爱好不同。

    收入,写文章是会有收入的,公众号里日常4毛,也有1块多的时候,但几分也有。好在,我现在也不在乎这个,主要是要做一件可以坚持的有意义的事。

    如果说能给你一些意见,我也建议你可以折腾折腾,程序员的世界里折腾一下还是可以全方位的学到很多东西的。做的久了会提升全栈的研发技能(后端、前端、部署、运维等等),而且还会获得;业务、运营、产品定位等等方面的提升。

    五、收个尾

    • 以上呢,是我学习和不断折腾的一个方式。算不上优秀,但至少这样的学习可以保证你毕业时候找一份不错的工作,也能为你将来做好后路的根基。虽然每个人都有自己的路,但如果到了年纪还是要多把时间放到有价值的事上。
    • 持续学习的过程遇到了很多伙伴,各有优秀。虽然他们不会把钱给咱们😁,但是这些伙伴的宝贵经验都是会无偿告诉你的。包括你学的技术遇到问题包括你写文章需要看哪些书籍包括你对各个领域的认知等等。
    • 做人,做事,我喜欢亲和友善,广结同好。自从写公众号文章,有很多小伙伴加了我的微信,也和很多人成为了好朋友,他们日常帮我点赞、分享文章,深深感谢!
    展开全文
  • 博客:https://bugstack.cn 沉淀、分享、成长,让自己和他人都能有所收获!???? 一、前言 给你一台服务器,你能把你写的代码部署到线上吗? 我们常常会听到这样一句话:“为了让研发只关心业务开发,我们做了某...
  • 微信公众号:bugstack虫洞栈 | 博客:https://bugstack.cn 沉淀、分享、成长,专注于原创专题案例,以最易学习编程的方式分享知识,让自己和他人都能有所收获。目前已完成的专题有;Netty4.x实战专题案例、用Java...
  • 爬虫大佬,把他总结的正则表达式使用给我了!

    万次阅读 多人点赞 2021-03-17 15:45:14
    博客:https://bugstack.cn 沉淀、分享、成长,让自己和他人都能有所收获!???? 一、前言 编程总在实践中出结果! 正则表达式,又称规则表达式。(英语:Regular Expression,在代码中常简写为regex、regexp或RE...
  • 几百行代码写个Mybatis,原理搞的透透的!

    万次阅读 多人点赞 2021-08-02 08:37:14
    博客:https://bugstack.cn 沉淀、分享、成长,让自己和他人都能有所收获!???? 一、前言 Mybatis 最核心的原理也是它最便于使用的体现,为什么这说? 因为我们在使用 Mybatis 的时候,只需要定义一个不需要写实现...
  • 博客:https://bugstack.cn 沉淀、分享、成长,让自己和他人都能有所收获! 一、前言 在上一篇 Helloworld 中,我们初步尝试使用了 Javassist字节编程的方式,来创建我们的方法体并通过反射调用运行了结果。大致...
  • 博客:https://bugstack.cn 视频:https://mp.weixin.qq.com/s/OmXCY4fTfDpkvjlg5ME0ZA 源码:https://github.com/fuzhengwei/NaiveChat 本项目是作者小傅哥使用JavaFx、Netty4.x、SpringBoot、Mysql等技术栈和偏向...
  • 写博客的2年,我有12万+粉丝了,还上了百度百科!

    万次阅读 多人点赞 2021-06-21 10:10:48
    博客:https://bugstack.cn 沉淀、分享、成长,让自己和他人都能有所收获!???? 一、粉丝还不少! 12万+的粉丝,在哪? 公众号:3万+、CSDN:5万+、思否: 2万+、Github: 1万+,其他平台:1万+,????合计 12万+ ...
  • 博客:https://bugstack.cn 沉淀、分享、成长,让自己和他人都能有所收获! 一、前言 到本章为止已经写了四篇关于字节码编程的内容,涉及了大部分的API方法。整体来说对 Javassist 已经有一个基本的使用认知。那么...
  • 博客:https://bugstack.cn 沉淀、分享、成长,让自己和他人都能有所收获! 目录 文章目录目录一、前言二、开发环境三、案例目标四、技术实现五、测试结果1. 使用Javassist生成的类2. 输出的测试结果六、总结 一、...
  • 博客:bugstack.cn 沉淀、分享、成长,让自己和他人都能有所收获! 一、前言 在我们实际的业务开发到上线的过程中,中间都会经过测试。那么怎么来保证测试质量呢?比如;提交了多少代码、提交了多少方法、有单元...
  • 博客:https://bugstack.cn 沉淀、分享、成长,让自己和他人都能有所收获! 一、前言 通过前面两篇 javassist 的基本内容,大体介绍了;类池(ClassPool)、类(CtClass)、属性(CtField)、方法(CtMethod),的使用方式...
  • 不想用百度云,那就教你自建属于自己的云盘!

    万次阅读 多人点赞 2020-05-11 08:17:05
    博客:https://bugstack.cn 沉淀、分享、成长,让自己和他人都能有所收获!???? 文章目录一、前言二、系统环境三、工程部署1. IDEA 配置FTP和上传代码1.1 配置路径1.2 上传文件2. 云盘安装和配置2.1 服务安装2.2 ...
  • 工作两年简历写成这样,谁要你呀!

    万次阅读 多人点赞 2020-04-12 09:55:07
    博客:https://bugstack.cn 沉淀、分享、成长,让自己和他人都能有所收获! 一、前言 最近有伙伴问小傅哥,我的简历怎么投递了都没有反应,心里慌的很呀。 工作两年了目前的公司没有什么大项目,整天的维护别人的...
  • 手撸 SpringBoot DDD 微服务脚手架

    万次阅读 多人点赞 2021-03-15 07:51:40
    博客:https://bugstack.cn 沉淀、分享、成长,让自己和他人都能有所收获!???? 一、前言 为什么我们要去造轮子? 造轮子的核心目的,是为了解决通用共性问题的凝练和复用。 虽然市面上已经有了大量成熟稳定用于...
  • 坚持写技术博客一年能有多少收获!

    万次阅读 多人点赞 2020-10-10 08:31:57
    博客:https://bugstack.cn 沉淀、分享、成长,让自己和他人都能有所收获!???? 让人怪不好意思的,小傅哥的粉丝破万了!???? 10.1 假期期间,公众号粉丝终于破万!是的,终于!因为与各大号主相比,我可能是涨粉...
  • 微信公众号:bugstack虫洞栈 | https://bugstack.cn 沉淀、分享、成长,专注于原创专题案例,以最易学习编程的方式分享知识,让自己和他人都能有所收获。目前已完成的专题有;Netty4.x实战专题案例、用Java实现JVM、...
  • 博客:https://bugstack.cn 沉淀、分享、成长,让自己和他人都能有所收获!???? 一、前言 什么样的简历容易被撩? 20年近6个月,看过400份+简历,筛选出不到100份能面试的! 在这些简历中有各式各样的秀,也有真...
  • 微信公众号:bugstack虫洞栈 | 博客:https://bugstack.cn 沉淀、分享、成长,专注于原创专题案例,以最易学习编程的方式分享知识,让自己和他人都能有所收获。目前已完成的专题有;Netty4.x实战专题案例、用Java...
  • 我的大学四年到毕业工作5年的学习路线资源汇总

    千次阅读 多人点赞 2020-03-31 13:37:10
    小傅哥 | https://bugstack.cn 沉淀、分享、成长,专注于原创专题案例,以最易学习编程的方式分享知识,让自己和他人都能有所收获。目前已完成的专题有;Netty4.x实战专题案例、用Java实现JVM、基于JavaAgent的全...
  • 微信公众号:bugstack虫洞栈 | https://bugstack.cn 沉淀、分享、成长,专注于原创专题案例,以最易学习编程的方式分享知识,让自己和他人都能有所收获。目前已完成的专题有;Netty4.x实战专题案例、用Java实现JVM、...
  • 博客:https://bugstack.cn 沉淀、分享、成长,让自己和他人都能有所收获!???? 一、前言 对于在校学习期间的计算机、软件工程的学生来说,只要学到 Java 多线程,就开始犯迷糊了! 刚知道咋打开 IDEA,费劲扒拉...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 883
精华内容 353
关键字:

bugstack