课程咨询: 400-996-5531 / 投诉建议: 400-111-8989

认识达内从这里开始

认真做教育 专心促就业

济南IT培训丨通往高级java开发的必经之路(中)
  • 发布:济南IT培训
  • 来源:互联网
  • 时间:2018-02-26 15:31
    3.2 大对象直接进入老年代
    所谓 "大对象" 就是指一个占用大量连续存储空间的对象,如数组.
    当发现一个大对象在 Eden 区+Survior1 区中存不下的时候就需要分配担保机制把当前 Eden 区+Survior1 区的所有对象都复制到老年代中去.
    我们知道,一个大对象能够存入 Eden 区+Survior1 区的概率比较小,发生分配担保的概率比较大,而分配担保需要涉及到大量的复制,就会造成效率低下.
    因此,对于大对象我们直接把他放到老年代中去,从而就能避免大量的复制操作.
    那么,什么样的对象才是 "大对象" 呢?
    通过-XX:PretrnureSizeThreshold 参数设置大对象,该参数用于设置大小超过该参数的对象被认为是 "大对象",直接进入老年代.
    注意:该参数只对 Serial 和 ParNew 收集器有效.
    3.3 生命周期较长的对象进入老年代
    老年代用于存储生命周期较长的对象,那么我们如何判断一个对象的年龄呢?
    新生代中的每个对象都有一个年龄计数器,当新生代发生一次 MinorGC 后,存活下来的对象的年龄就加一,当年龄超过一定值时,就将超过该值的所有对象转移到老年代中去.
    使用-XXMaxTenuringThreshold 设置新生代的最大年龄,设置该参数后,只要超过该参数的新生代对象都会被转移到老年代中去.
    3.4 相同年龄的对象内存超过 Survior 内存一半的对象进入老年代
    如果当前新生代的 Survior 中,年龄相同的对象的内存空间总和超过了 Survior 内存空间的一半,那么所有年龄相同的对象和超过该年龄的对象都被转移到老年代中去.
    无需等到对象的年龄超过 MaxTenuringThreshold 才被转移到老年代中去.
    3.5 "分配担保" 策略详解
    当垃圾收集器准备要在新生代发起一次 MinorGC 时,首先会检查 "老年代中最大的连续空闲区域的大小 是否大于 新生代中所有对象的大小?",也就是老年代中目前能够将新生代中所有对象全部装下?
    若老年代能够装下新生代中所有的对象,那么此时进行 MinorGC 没有任何风险,然后就进行 MinorGC.
    若老年代无法装下新生代中所有的对象,那么此时进行 MinorGC 是有风险的,垃圾收集器会进行一次预测:根据以往 MinorGC 过后存活对象的平均数来预测这次 MinorGC 后存活对象的平均数.
    如果以往存活对象的平均数小于当前老年代最大的连续空闲空间,那么就进行 MinorGC,虽然此次 MinorGC 是有风险的.
    如果以往存活对象的平均数大于当前老年代最大的连续空闲空间,那么就对老年代进行一次 Full GC,通过清除老年代中废弃数据来扩大老年代空闲空间,以便给新生代作担保.
    这个过程就是分配担保.
    注意:
    分配担保是老年代为新生代作担保;
    新生代中使用 "复制" 算法实现垃圾回收,老年代中使用 "标记-清除" 或 "标记-整理" 算法实现垃圾回收,只有使用 "复制" 算法的区域才需要分配担保,因此新生代需要分配担保,而老年代不需要分配担保.
    四、了解 Java 虚拟机的垃圾回收算法
    Java 虚拟机的内存模型分为五个部分,分别是:程序计数器、Java 虚拟机栈、本地方法栈、堆、方法区.
    这五个区域既然是存储空间,那么为了避免 Java 虚拟机在运行期间内存存满的情况,就必须得有一个垃圾收集者的角色,不定期地回收一些无效内存,以保障 Java 虚拟机能够健康地持续运行.
    这个垃圾收集者就是平常我们所说的 "垃圾收集器",那么垃圾收集器在何时清扫内存?清扫哪些数据?这就是接下来我们要解决的问题.
    程序计数器、Java 虚拟机栈、本地方法栈都是线程私有的,也就是每条线程都拥有这三块区域,而且会随着线程的创建而创建,线程的结束而销毁.
    那么,垃圾收集器在何时清扫这三块区域的问题就解决了.
    此外,Java 虚拟机栈、本地方法栈中的栈帧会随着方法的开始而入栈,方法的结束而出栈,并且每个栈帧中的本地变量表都是在类被加载的时候就确定的.
    因此以上三个区域的垃圾收集工作具有确定性,垃圾收集器能够清楚地知道何时清扫这三块区域中的哪些数据.
    然而,堆和方法区中的内存清理工作就没那么容易了.
    堆和方法区所有线程共享,并且都在 JVM 启动时创建,一直得运行到 JVM 停止时.因此它们没办法根据线程的创建而创建、线程的结束而释放.
    堆中存放 JVM 运行期间的所有对象,虽然每个对象的内存大小在加载该对象所属类的时候就确定了,但究竟创建多少个对象只有在程序运行期间才能确定.
    方法区中存放类信息、静态成员变量、常量.类的加载是在程序运行过程中,当需要创建这个类的对象时才会加载这个类.因此,JVM 究竟要加载多少个类也需要在程序运行期间确定.
    因此,堆和方法区的内存回收具有不确定性,因此垃圾收集器在回收堆和方法区内存的时候花了一些心思.
    4.1 堆内存的回收
    4.1.1 如何判定哪些对象需要回收?
    在对堆进行对象回收之前,首先要判断哪些是无效对象.我们知道,一个对象不被任何对象或变量引用,那么就是无效对象,需要被回收.一般有两种判别方式:
    引用计数法:每个对象都有一个计数器,当这个对象被一个变量或另一个对象引用一次,该计数器加一;若该引用失效则计数器减一.当计数器为 0 时,就认为该对象是无效对象.
    可达性分析法:所有和 GC Roots 直接或间接关联的对象都是有效对象,和 GC Roots 没有关联的对象就是无效对象.
    GC Roots 是指:
    Java 虚拟机栈所引用的对象 (栈帧中局部变量表中引用类型的变量所引用的对象);
    方法区中静态属性引用的对象;
    方法区中常量所引用的对象;
    本地方法栈所引用的对象.
    两者对比:
    引用计数法虽然简单,但存在一个严重的问题,它无法解决循环引用的问题.
    因此,目前主流语言均使用可达性分析方法来判断对象是否有效.
    4.1.2 回收无效对象的过程
    当 JVM 筛选出失效的对象之后,并不是立即清除,而是再给对象一次重生的机会,具体过程如下:
    判断该对象是否覆盖了 finalize() 方法;
    若已覆盖该方法,并该对象的 finalize() 方法还没有被执行过,那么就会将 finalize() 扔到 F-Queue 队列中;
    若未覆盖该方法,则直接释放对象内存.
    执行 F-Queue 队列中的 finalize() 方法;
    虚拟机会以较低的优先级执行这些 finalize() 方法们,也不会确保所有的 finalize() 方法都会执行结束.
    如果 finalize() 方法中出现耗时操作,虚拟机就直接停止执行,将该对象清除.
    对象重生或死亡;
    如果在执行 finalize() 方法时,将 this 赋给了某一个引用,那么该对象就重生了.如果没有,那么就会被垃圾收集器清除.
    注意:强烈不建议使用 finalize() 函数进行任何操作!如果需要释放资源,请使用 try-finally.因为 finalize() 不确定性大,开销大,无法保证顺利执行.
    4.2 方法区的内存回收
    我们知道,如果使用复制算法实现堆的内存回收,堆就会被分为新生代和老年代,新生代中的对象 "朝生夕死",每次垃圾回收都会清除掉大量的对象;而老年代中的对象生命较长,每次垃圾回收只有少量的对象被清除掉.
    由于方法区中存放生命周期较长的类信息、常量、静态变量,因此方法区就像是堆的老年代,每次垃圾收集的只有少量的垃圾被清除掉.
    方法区中主要清除两种垃圾:
    废弃常量;
    废弃的类.
    4.2.1 如何判定废弃常量?
    清除废弃的常量和清除对象类似,只要常量池中的常量不被任何变量或对象引用,那么这些常量就会被清除掉.
    4.2.2 如何废弃废弃的类?
    清除废弃类的条件较为苛刻:
    该类的所有对象都已被清除;

    该类的 java.lang.Class 对象没有被任何对象或变量引用;只要一个类被虚拟机加载进方法区,那么在堆中就会有一个代表该类的对象:java.lang.Class.这个对象在类被加载进方法区的时候创建,在方法区中该类被删除时清除;

    加载该类的 ClassLoader 已经被回收.

济南IT培训

    4.3 垃圾收集算法
    现在我们知道了判定一个对象是无效对象、判定一个类是废弃类、判定一个常量是废弃常量的方法,也就是知道了垃圾收集器会清除哪些数据,那么接下来介绍如何清除这些数据.
    4.3.1 标记-清除算法
    首先利用刚才介绍的方法判断需要清除哪些数据,并给它们做上标记;然后清除被标记的数据.
    分析:这种算法标记和清除过程效率都很低,而且清除完后存在大量碎片空间,导致无法存储大对象,降低了空间利用率.
    4.3.2 复制算法
    将内存分成两份,只将数据存储在其中一块上.当需要回收垃圾时,也是首先标记出废弃的数据,然后将有用的数据复制到另一块内存上,最后将第一块内存全部清除.
    分析:这种算法避免了碎片空间,但内存被缩小了一半.而且每次都需要将有用的数据全部复制到另一片内存上去,效率不高.
    解决空间利用率:在新生代中,由于大量的对象都是 "朝生夕死",也就是一次垃圾收集后只有少量对象存活,因此我们可以将内存划分成三块:Eden、Survior1、Survior2,内存大小分别是 8:1:1.
    分配内存时,只使用 Eden 和一块 Survior1.当发现 Eden+Survior1 的内存即将满时,JVM 会发起一次 MinorGC,清除掉废弃的对象,并将所有存活下来的对象复制到另一块 Survior2 中.那么,接下来就使用 Survior2+Eden 进行内存分配.
    通过这种方式,只需要浪费 10% 的内存空间即可实现带有压缩功能的垃圾收集方法,避免了内存碎片的问题.
    但是,当一个对象要申请内存空间时,发现 Eden+Survior 中剩下的空间无法放置该对象,此时需要进行 Minor GC,如果 MinorGC 过后空闲出来的内存空间仍然无法放置该对象,那么此时就需要将对象转移到老年代中,这种方式叫做 "分配担保".
    什么是分配担保?
    当 JVM 准备为一个对象分配内存空间时,发现此时 Eden+Survior 中空闲的区域无法装下该对象,那么就会触发 MinorGC,对该区域的废弃对象进行回收.
    但如果 MinorGC 过后只有少量对象被回收,仍然无法装下新对象,那么此时需要将 Eden+Survior 中的所有对象都转移到老年代中,然后再将新对象存入 Eden 区.这个过程就是 "分配担保".
    4.3.3 标记-整理算法
    在回收垃圾前,首先将所有废弃的对象做上标记,然后将所有未被标记的对象移到一边,最后清空另一边区域即可.
    分析:它是一种老年代的垃圾收集算法.
    老年代中的对象一般寿命比较长,因此每次垃圾回收会有大量对象存活,因此如果选用 "复制" 算法,每次需要复制大量存活的对象,会导致效率很低.
    而且,在新生代中使用 "复制" 算法,当 Eden+Survior 中都装不下某个对象时,可以使用老年代的内存进行 "分配担保",而如果在老年代使用该算法,那么在老年代中如果出现 Eden+Survior 装不下某个对象时,没有其他区域给他作分配担保.
    因此,老年代中一般使用 "标记-整理" 算法.
    4.3.4 分代收集算法
    将内存划分为老年代和新生代.老年代中存放寿命较长的对象,新生代中存放 "朝生夕死" 的对象.然后在不同的区域使用不同的垃圾收集算法.
    4.4 Java 中引用的种类
    Java 中根据生命周期的长短,将引用分为 4 类.
    4.4.1 强引用
    我们平时所使用的引用就是强引用.
    A a = new A(); 也就是通过关键字 new 创建的对象所关联的引用就是强引用.
    只要强引用存在,该对象永远也不会被回收.
    4.4.2 软引用
    只有当堆即将发生 OOM 异常时,JVM 才会回收软引用所指向的对象.
    软引用通过 SoftReference 类实现.软引用的生命周期比强引用短一些.
    4.4.3 弱引用
    只要垃圾收集器运行,软引用所指向的对象就会被回收.
    弱引用通过 WeakReference 类实现.弱引用的生命周期比软引用短.
    4.4.4 虚引用
    虚引用也叫幽灵引用,它和没有引用没有区别,无法通过虚引用访问对象的任何属性或函数.
    一个对象关联虚引用唯一的作用就是在该对象被垃圾收集器回收之前会受到一条系统通知.虚引用通过 PhantomReference 类来实现.
    五、class 文件结构详解
    5.1 什么是 JVM 的 "无关性"?
    Java 具有平台无关性,也就是任何操作系统都能运行 Java 代码.之所以能实现这一点,是因为 Java 运行在虚拟机之上,不同的操作系统都拥有各自的 Java 虚拟机,因此 Java 能实现 "一次编写,处处运行".
    而 JVM 不仅具有平台无关性,还具有语言无关性.平台无关性是指不同操作系统都有各自的 JVM,而语言无关性是指 Java 虚拟机能运行除 Java 以外的代码!
    这听起来非常惊人,但 JVM 对能运行的语言是有严格要求的.首先来了解下 Java 代码的运行过程.
    Java 源代码首先需要使用 Javac 编译器编译成 class 文件,然后启动 JVM 执行 class 文件,从而程序开始运行.
    也就是 JVM 只认识 class 文件,它并不管何种语言生成了 class 文件,只要 class 文件符合 JVM 的规范就能运行.
    因此目前已经有 Scala、JRuby、Jython 等语言能够在 JVM 上运行.它们有各自的语法规则,不过它们的编译器都能将各自的源码编译成符合 JVM 规范的 class 文件,从而能够借助 JVM 运行它们.
    5.2 纵观 Class 文件结构
    class 文件是二进制文件,它的内容具有严格的规范,文件中没有任何空格,全是连续的 0/1.class 文件中的所有内容被分为两种类型:无符号数 和 表.
    无符号数;
    它表示 class 文件中的值,这些值没有任何类型,但有不同的长度.根据这些值长度的不同分为:u1、u2、u4、u8,分别代表 1 字节的无符号数、2 字节的无符号数、4 字节的无符号数、8 字节的无符号数.
    表;
    class 文件中所有数据 (即无符号数) 要么单独存在,要么由多个无符号数组成二维表.即 class 文件中的数据要么是单个值,要么是二维表.
    5.2.1 class 文件的组织结构
    魔数;
    本文件的版本信息;
    常量池;
    访问标志;
    类索引;
    父类索引;
    接口索引集合;
    字段表集合;
    方法表集合.
    5.3 Class 文件的构成 1:魔数
    class 文件的头 4 个字节称为魔数,用来表示这个 class 文件的类型.
    魔数的作用就相当于文件后缀名,只不过后缀名容易被修改,不安全,因此在 class 文件中标示文件类型比较合适.
    class 文件的魔数是用 16 进制表示的 "CAFEBABE",非常具有浪漫主义色彩,谁说程序员的情商都很低!
    5.4 Class 文件的构成 2:版本信息
    紧接着魔数的 4 个字节是版本号.它表示本 class 中使用的是哪个版本的 JDK.
    在高版本的 JVM 上能够运行低版本的 class 文件,但在低版本的 JVM 上无法运行高版本的 class 文件,即使该 class 文件中没有用到任何高版本 JDK 的特性也无法运行!
    5.5 Class 文件的构成 3:常量池
    5.5.1 什么是常量池?
    紧接着版本号之后的就是常量池.常量池中存放两种类型的常量:
    1)字面值常量,即我们在程序中定义的字符串、被 final 修饰的值.
    2)符号引用,就是我们定义的各种名字:
    类和接口的全限定名;
    字段的名字 和 描述符;
    方法的名字 和 描述符.
    5.5.2 常量池的特点
    常量池长度不固定
    常量池的大小是不固定的,因此常量池开头放置一个 u2 类型的无符号数,用来存储当前常量池的容量.JVM 根据这个值就知道常量池的头尾来.
    注:这个值是从 1 开始的,若为 5 表示池中有 4 个常量.
    常量池中的常量由而为表来表示;
    常量池开头有个常量池容量计数器,接下来就全是一个个常量了,只不过常量都是由一张张二维表构成,除了记录常量的值以外,还记录当前常量的相关信息.
    常量池是 class 文件的资源仓库;
    常量池是与本 class 中其它部分关联最多的部分;
    常量池是 class 文件中空间占用最大的部分之一.
    5.5.3 常量池中常量的类型
    刚才介绍了,常量池中的常量大体上分为:字面值常量 和 符号引用.在此基础上,根据常量的数据类型不同,又可以被细分为 14 种常量类型.
    这 14 种常量类型都有各自的二维表示结构.每种常量类型的头 1 个字节都是 tag,用于表示当前常量属于 14 种类型中的哪一个.
    name_index 表示这个类或接口全限定名的位置.它的值表示指向常量池的第几个常量.它会指向一个 CONSTANT_Utf8_info 类型的常量.
    它的二维表结构如下:tag 表示当前常量的类型 (当前常量为 CONSTANT_Class_info,因此 tag 的值应为 7,表示一个类或接口的全限定名);
    为什么 Java 中定义的类、变量名字必须小于 64K?
    CONSTANT_Utf8_info 表示字符串常量;
    tag 表示当前常量的类型,这里应该是 1;
    length 表示这个字符串的长度;
    bytes 为这个字符串的内容 (采用缩略的 UTF8 编码).
    类、接口、变量等名字都属于符号引用,它们都存储在常量池中.而不管哪种符号引用,它们的名字都由 CONSTANT_Utf8_info 类型的常量表示,这种类型的常量使用 u2 存储字符串的长度.
    由于 2 字节最多能表示 65535 个数,因此这些名字的最大长度最多只能是 64K.
    什么是 UTF-8 编码?什么是缩略 UTF-8 编码?
    前者每个字符使用 3 个字节表示,而后者把 128 个 ASKII 码用 1 字节表示,某些字符用 2 字节表示,某些字符用 3 字节表示.
    5.6 Class 文件的构成 4:访问标志
    在常量池之后是 2 字节的访问标志.访问标志是用来表示这个 class 文件是类还是接口、是否被 public 修饰、是否被 abstract 修饰、是否被 final 修饰等.
    由于这些标志都由是 / 否表示,因此可以用 0/1 表示.访问标志为 2 字节,可以表示 16 位标志,但 JVM 目前只定义了 8 种,未定义的直接写 0.
    本篇文章是由济南IT培训为您呈现,希望给您带来更多更好的文章,喜欢的朋友们可以添加微信公众号.

    更多济南IT培训相关咨询,请扫描下方二维码

济南IT培训

<  上一篇:济南IT培训丨通往高级 Java 开发的必经之路(上)
下一篇:济南IT培训丨通往高级 Java 开发的必经之路(下)  >
相关推荐
最新资讯
免费试听课程
  • 全部课程
  • IT课程
  • 设计课程
  • 运营课程
Free courses
最新开班时间
  • 北京
  • 上海
  • 广州
  • 深圳
  • 南京
  • 成都
  • 武汉
  • 西安
  • 青岛
  • 天津
  • 杭州
  • 重庆
  • 哈尔滨
  • 济南
  • 沈阳
  • 合肥
  • 郑州
  • 长春
  • 苏州
  • 长沙
  • 昆明
  • 太原
  • 无锡
  • 石家庄
  • 南宁
  • 佛山
  • 珠海
  • 宁波
  • 保定
  • 呼和浩特
  • 洛阳
  • 烟台
  • 运城
  • 潍坊
  • 开课名称
  • 开班时间
  • 抢座
  • 咨询
  • 开课名称
  • 开班时间
  • 抢座
  • 咨询
    • Java全链路开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 云计算全栈开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 网络安全工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 人工智能工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 数据分析与商业智能
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • C++物联网工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 软件测试工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • AI大模型全栈工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 鸿蒙原生应用开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • VFX商业视效设计
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • AGI商业设计变现
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 新媒体电商运营
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 云计算全栈开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • C++物联网工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 软件测试工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • AI大模型全栈工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 鸿蒙原生应用开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • VFX商业视效设计
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 云计算全栈开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 网络安全工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • C++物联网工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 软件测试工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • AI大模型全栈工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 鸿蒙原生应用开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • VFX商业视效设计
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • Java全链路开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 云计算全栈开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 网络安全工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • C++物联网工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 软件测试工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • AI大模型全栈工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 鸿蒙原生应用开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • VFX商业视效设计
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • AGI商业设计变现
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 新媒体电商运营
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 云计算全栈开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 网络安全工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • C++物联网工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 软件测试工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • AI大模型全栈工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 鸿蒙原生应用开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • VFX商业视效设计
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • AGI商业设计变现
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 新媒体电商运营
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • Java全链路开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 云计算全栈开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 网络安全工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • C++物联网工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 软件测试工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • AI大模型全栈工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 鸿蒙原生应用开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • VFX商业视效设计
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • Java全链路开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 网络安全工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • C++物联网工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 软件测试工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • AI大模型全栈工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 鸿蒙原生应用开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • VFX商业视效设计
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 云计算全栈开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 网络安全工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • C++物联网工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 软件测试工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • AI大模型全栈工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 鸿蒙原生应用开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • C++物联网工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 软件测试工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • AI大模型全栈工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 鸿蒙原生应用开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • VFX商业视效设计
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • Java全链路开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • C++物联网工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 软件测试工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • AI大模型全栈工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 鸿蒙原生应用开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • VFX商业视效设计
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • Java全链路开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 网络安全工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 数据分析与商业智能
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • C++物联网工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 软件测试工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • AI大模型全栈工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 鸿蒙原生应用开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • VFX商业视效设计
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • AGI商业设计变现
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 新媒体电商运营
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • Java全链路开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 网络安全工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • C++物联网工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 软件测试工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • AI大模型全栈工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 鸿蒙原生应用开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • VFX商业视效设计
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • Java全链路开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • C++物联网工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 软件测试工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • AI大模型全栈工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 鸿蒙原生应用开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • VFX商业视效设计
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • Java全链路开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 网络安全工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • C++物联网工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 软件测试工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • AI大模型全栈工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 鸿蒙原生应用开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • VFX商业视效设计
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 新媒体电商运营
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • Java全链路开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 网络安全工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • C++物联网工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 软件测试工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • AI大模型全栈工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 鸿蒙原生应用开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • AGI商业设计变现
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • Java全链路开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 网络安全工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • C++物联网工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 软件测试工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • AI大模型全栈工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 鸿蒙原生应用开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • VFX商业视效设计
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 云计算全栈开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 网络安全工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • C++物联网工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 软件测试工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • AI大模型全栈工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 鸿蒙原生应用开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • VFX商业视效设计
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • AGI商业设计变现
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 新媒体电商运营
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • Java全链路开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • C++物联网工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 软件测试工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • AI大模型全栈工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 鸿蒙原生应用开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • VFX商业视效设计
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • Java全链路开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 网络安全工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • C++物联网工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 软件测试工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • AI大模型全栈工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 鸿蒙原生应用开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • Java全链路开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 云计算全栈开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • C++物联网工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 软件测试工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • AI大模型全栈工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 鸿蒙原生应用开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • VFX商业视效设计
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 网络安全工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • C++物联网工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 软件测试工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • AI大模型全栈工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 鸿蒙原生应用开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • VFX商业视效设计
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 新媒体电商运营
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • Java全链路开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 网络安全工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • C++物联网工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 软件测试工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • AI大模型全栈工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 鸿蒙原生应用开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • VFX商业视效设计
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • AGI商业设计变现
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • Java全链路开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • C++物联网工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 软件测试工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • AI大模型全栈工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 鸿蒙原生应用开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • AGI商业设计变现
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 云计算全栈开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • C++物联网工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 软件测试工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • AI大模型全栈工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 鸿蒙原生应用开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • VFX商业视效设计
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • Java全链路开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 网络安全工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • C++物联网工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 软件测试工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • AI大模型全栈工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 鸿蒙原生应用开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • AGI商业设计变现
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 网络安全工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • C++物联网工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 软件测试工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • AI大模型全栈工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 鸿蒙原生应用开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • VFX商业视效设计
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 网络安全工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • C++物联网工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 软件测试工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • AI大模型全栈工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 鸿蒙原生应用开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • VFX商业视效设计
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • Java全链路开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • C++物联网工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 软件测试工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • AI大模型全栈工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 鸿蒙原生应用开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • AGI商业设计变现
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 网络安全工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • C++物联网工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 软件测试工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • AI大模型全栈工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 鸿蒙原生应用开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • VFX商业视效设计
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 网络安全工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • C++物联网工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 软件测试工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • AI大模型全栈工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 鸿蒙原生应用开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • AGI商业设计变现
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 网络安全工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • C++物联网工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 软件测试工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • AI大模型全栈工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 鸿蒙原生应用开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • VFX商业视效设计
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • C++物联网工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 软件测试工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • AI大模型全栈工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 鸿蒙原生应用开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • VFX商业视效设计
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 网络安全工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • C++物联网工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 软件测试工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • AI大模型全栈工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 鸿蒙原生应用开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • VFX商业视效设计
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • C++物联网工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 软件测试工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • AI大模型全栈工程师
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • 鸿蒙原生应用开发
    • 5月29日
    • 火热抢座中
    • 立即咨询
    • VFX商业视效设计
    • 5月29日
    • 火热抢座中
    • 立即咨询
预约申请试听课
收起