说人话,重视站,讲干货。你好,欢迎来到 it 老师的架构六百讲,我是你们的艾瑞私人顾问老齐。到现在我已经录制了十多门与编程架构相关的最新课程,同时还会提供简历优化、模拟面试、 offer 选择、课程指导、工作建议等多种服务。总之,只要我有经验的事情,一定会提供建议和帮助。有兴趣的小伙伴可以看一下评论区。 在二三年的九月份,我们即将迎来在 j d k 里程碑中,另一个重量级的版本,也就是 j d k 二十一。 它是我们目前发布的最新的 l t s 长期支持版本。其中在前两个版本中,风风火火的虚拟现成特性呢,在 l t s j d k 二十一版本中呢,得到了时装。 那到底什么是虚拟现成呢?我认为大家有必要了解一下。好老规矩,咱们回到笔记来进行讲解。首先呢,在页面上我们看到 连接呢是 j d k 二十一版本,它呢即将发布了。在正式的九月十九日呢,它将与我们见面。那么在这个 j d k 二十一,作为目前最新的 l t s 版本,也就是长期支持版本中,最受瞩目的就是虚拟现成特性了。 尽管在前面的 jdk 二十版本中呢,他呢已经进行了时装,但是呢,真正的我们可以投入到生产环境下,我们还是要考虑使用 lts 这种长期支持版本。 那这也就意味着,在 jdk 二十一版本中呢,我们正式的可以考虑在生产环境中来使用虚拟县城了。那什么是虚拟县城呢?我们来看一下。那说起虚拟县城,那就不得不提到我们的这个平台县城了,什么是平台县城呢? 我们简单回顾一下。在我们的操作系统中啊,底层呢,都会有一个一个的线程,这是没有问题的。 但是呢,在我们进行扎瓦开发的时候,都知道在扎瓦中有 sweat 对象,那么每一个 sweat 对象,其实呢都被称为是一个平台县城。而这个平台县城,从实现的角度来说,它和我们 操作系统级别的这个线程呢,他是一一对应的。只不过作为平台线程呢,是为被 jvm 来进行管理的。你可以认为平台线程就是操作系统线程的一个包装罢了。 那么在我们进行业务开发的时候啊,作为平台县城呢,在调度的时候,其实并不是轻量级的哎,经常有人会说说我们的县城哎,一弄弄几千个上万个,在我眼里看来,这都 是无稽之谈。为什么?因为本身来说,你可以看到作为县城,他在我们应用的过程中本身就是重量级的,而且在扎瓦中,他更是重量级。因为在默认过程中,在一个县城内部呢,他有着很多的呃子的内容。而且呢, 我们为每一个县城,如果是六十四位的 j v m 默认一个县城,我们会给他分配一兆内存,而早期的三十二位的 j v m 也会分配二百五十六 k。 这也就意味着,如果我们大量的产生了很多这个平台现成的话,那很有可能就会造成这个内存溢出的情况。比如说咱们现在看到了我创建了这个好多好多现成,那么在这个创建的过程中,过了几秒钟哎,根据我们内存大小, 时间有长有短,他呢就直接爆出来了 out of memory error, 也就是我们内存易出错了。那你可以看到,作为咱们的平台县城,对于内存的占用呢?这个问题是不可忽视的。在我们实际开发的时候, 县城本身不应该成为一个很大数量级的东西。那在过程中呢,其实虚拟县城就是为了解决传统咱们的县城的一系列短板的。 我们先来看一下传统线程会有哪些问题呢?首先就是资源效率的问题。就像说到的平台线程呢,默认呢,他要么二百五十六 k, 要么一兆,这样内存相对来说是比较大的。 在我们进行内存的应用角度来说,这个线程呢,其实并不是一个高效的选择。而相对应 虚拟县城呢,他呢可能只占用几个字节,而且这个字节的数据呢,是保存在堆中的。这是和平台县城最很大的一点不同,作为这个虚拟县城,他是放在堆中的。 那么第二个呢,就是县城的管理了。县城的管理在虚拟县城下,创建和管理都非常的清,量级也非常的简单,甚至可以通过工厂方法,可以轻松的去创建新的这个虚拟县城,我们无需手动的来管理这个虚拟县城的资源。 第三个呢,可以规避县城爆炸的情况。如果有人说我们把自己的项目中的县城设置了一千两千个,那是胡扯,我们的县城本身就是宝贵的资源。在我们一开始进行项目设计的时候,哎,一般 的指导原则是,如果是这种一般性的 io 应用的话,那么我们的这个线程数量是 cpu 核数的两倍或者呢三倍,但一定不会是一个特别大的数量级,因为每个线程呢,都会占用很多很多的内存。 然后第四个,在协作调度方面,因为在县城的协作调度是要占用大量的 cpu 来进行的,所以呢本身要 进行,比如说锁蒸制,然后上下纹的切换等等等等,这也会造成大量的 cpu 的额外的损耗。那么相比来说,虚拟县城就会更加清亮级。第五个呢,就是阻塞的问题, 传统的线程呢,在遇到阻塞时呢,会一直处于等待的情况,然后而虚拟线程呢,遇到阻塞的时候 可以直接释放使用权,然后允许其他县城呢,哎,被装载到我们现有的县城载体中来直接运行。那这以上呢,其实都是虚拟县城,相比起平台县城,它的优势所在一句话,更加轻量级,占用更少的资源。 那么我们如何来创建虚拟县城呢?主要提供了三种方式。第一种方式最简单,里边在 j d k 二十一版本中提供了 spread 点 off visual, 然后呢去设置现成的名字,然后我们将自己所需要执行的任务呢,封装了一个 runnub 对象,然后呢来进行 start 启动就行了。那这样的话,创建一个虚拟现成。当然与我们大多数的现成处理一样。在这个 j d k 二十一版本中呢,也提供了 池这个概念。那这里呢,你看到他提供了 new visual spread protest executor, 它呢这就是一个虚拟的现成池,我们会为每一个任务呢分配虚拟的现成。具体的代码呢,就是这个样子的,有兴趣的话你可以暂停看一下。 那么作为当前的这种使用呢,有一个小问题,在程序运行的时候,我们是看不到现成的名字的,那这就会导致我们在应用的时候可能会出现调试比较麻烦的事,你谁也不知道哎,这些虚拟现成到底表达的是什么意思,怎么办呢?那 官方推荐的使用形式呢,是构建一个工厂,在工厂中呢,去说明这个县城他的用途,比如说他可以增加一个县城的名字前缀。然后呢, 在结合刚才我们代码传入工厂以后,那么在未来程序运行的时候,你再回来看,作为我们这个虚拟县城的名称呢,他就可以暴露了出来,你就知道哦,原来这个县城是做什么用的了。 那这这就是我们虚拟县城他在实际应用中创建的两种方式。一种呢是哎,直接创建,另外一种呢,采用池的方式来进行创建。 那在我们使用的时候,最核心有一个问题需要解决。你肯定会好奇,虚拟县城到底是如何工作呢?其实啊,非常的简单。我们来看一下。 在一开始进行业务初始化的时候,我们的操作系统的线程和平台线程呢,是一对一的关系。同时呢,作为操作系统和平台线程呢,是严格 按照我们 cpu 的和数来一一对应的。比如说在平台县城中,我们现在是一个八盒的 cpu, 那我这里呢,他就平台县城创建八个,相当于我们在这里哎,我留下来一个固定的资源。 然后呢,在扎瓦的堆中呢,去构建了一系列的虚拟县城。你可以认为每一个虚拟县城呢,都是一个任务, 那在实际运行的时候,然后动态的来调度虚拟县城和我们这个平台县城的载体,你会发现这里边有一个点, 所有的操作,我们的平台县城的总量在实际运行时是一直不变的,只不过呢,通过我们的动态的调度呢来安排。哎,我们哪一些虚拟县城是可以被执行的?只要他被送到了 这个平台线程上,就可以被执行,不需要的直接送回去。那么到底什么情况下可以执行,什么情况下不能执行呢?其实也很好理解。那我们可以看一下在刚才的这个日志的输出中, 虚拟县城呢?哎,在日志输出的时候,左边的地方就是虚拟县城,包括他的这个 id 以及他的名称。在右侧的部分中,则对应了其实就是我们现在的平台县城中,他的这个对应的县城的编号,比如说 work 杠二。 那么在实际运行的过程中,那如正常的业务操作被分配给了某一个这个县城来进行处理,那一旦我们的这个逊县城产生了阻塞,这个阻塞的对象呢?就会被复制送回到扎瓦的堆中。然后 在动态调度其他的这个虚拟县城呢,到当前的这个平台县城,或者到其他的平台县城上。比如说现在我们这里有六个平台县城。好,那么按照逻辑上,这六个县城一开始都会被赋予对应的虚拟县城,但是在运行过程中, 某一个虚拟县城进入到了阻塞,比如说磁盘进入血进入到阻塞状态,那这个虚拟县城呢,就会直接被复制送回到了扎瓦的堆中,然后再调度其他的等待处理的这个虚拟县城呢,送给这个啊被释放的平台县城。 那也就是说这些平台县城呢,其实呢,如果从呃微观的角度来说,他的负载一直是很高的,他一直是满载的,因为不断的都会送来了这个需要被处理的 虚拟县城。所以你会发现,作为虚拟县城,他对于 cpu 的使用率其实是非常非常高的,他通过一个合理的调度的机制来进行构建。 那么这里呢,有一个小问题,我们肯定会好奇,哎,到底虚拟现成刚才说到的 cpu 的核心数是指的物理的核数还是虚拟的核数呢? 那这个呢,我们做一个实验。这里我的服务器上显然呢是有四盒,四个逻辑盒。然后呢,我们创建了五个虚拟县城。当创建了五个虚拟县城,你看程序运行过程中,它产生的输出是什么呢? 大家请看。现在呢这五个虚拟线程一二三四五,但是呢,被分配给了一二三四四,被分配给了 四个我们的平台县城。这里的四号县城呢,他呢处理了两个任务,你也发现了,其实呢,这里的我们的平台县城呢,是以虚拟的逻辑和来进行的。哎,你有多少逻辑和在这里,他就会创建多少个平台县城。 而上面的虚拟县城呢,会在这里呢去重用这些稳定的啊平台县城来去进行调度和执行。那以上呢,就是我粗略的给大家去介绍了这个虚拟县城到底是怎么回事,希望呢能对你有帮助。
粉丝5977获赞2.0万

扎瓦二十一正式发布了,迎来史诗级增强,九月十九号, gdk 二十一如约而至,我认为这是继扎瓦巴之后最有用的一个 lts 的版本。这么多年来啊,阿瓦贝诟病最多的就是不支持携程,这个携程啊,他不是你买票的那个软件,而是星语线程这玩意啊。终于在 gdk 二十一当中结束了预览,推出了正式版 虚拟线程呢,它是 gdk 实现的轻量级线程,它可以避免上下文切换带来的额外消耗。它的实现原理其实就是 gdk 不再是每一个线程一对一的对应到操作系统当中的一个线程,而是会将多个虚拟线程映射到少量的操作系统线程当中, 通过有效的调度来避免那些上下文切换,总之就是又快又强。除此以外呢,还有几个新增的 gep, 简单说一说,首先就是我们之前视频说过的那个最没用的简化 hello word 写法的 gep 四四五,这个咱就不展开说了。 还有一个呢,就是之前啊,一直都说 j g c 是因为麻烦而没有支持分带嘛,这个空终于在几年后被填上了。这个版本在 j g c 的基础上扩展了一个支, 是分代的 g g c, 可以提升 g c 的效率,降低开销。还有就是多个版本当中都预览过的死位置的模式匹配和 record 模式都变成了正式版死位置模式匹配啊,让死位置更加强大了。 record 模式就是针对 gdp 十四当中新出的 record 进行的增强。 同时啊,这个版本当中还有自负川模板作用,预值结构化并发等几个特性也都处于预览阶段,将会在后续的版本当中正式推出。那最后关于要不要升级,我认为可以升,毕竟新颖县城太香了。如果要升,建议直接跳过十一和十七,直接一步升到二十一,毕竟新颖县城太香了。

今天继续给大家讲 jdk 二十一新特性之结构化并发,我是大肚肚周瑜,那什么是结构化并发呢?在讲结构化并发之前,我们先来看一下我们的现成尺他有什么缺点,这是一段很简单的现成尺的代码,代码的需求背景是像我们某宝,他的用户信息页,他肯定就需要去查询用户的信息,也需要去查询订单的信息, 那假如这个功能有一个接口来实现的话,那么这个接口他既需要去调用用户的微服务,也需要去调用获取订单信息的微服务。 那么这两个任务呢,我就是在模拟调用他们各自的微服,比如说获取用户信息就需要执行三秒啊,执行之前会打印开始,执行之后会打印结束,调用订单的信息也会执行三秒开始和结束。 那么对于这两个任务,我们可以并行的去执行他们,并且可以主色式的去获取各自的结果,然后得到结果之后就进行数据的组装。那么对于这个代码呢,好像看上去是没有太大问题的,我们来执行一下执行效果,也可以看得出来,他 确实是先就病情的执行了这两个任务的开始,然后大概等了三秒之后呢,就各自拿到了这两个任务的结果。那么假设我们来想一种情况,就是我在执行用户任务的时候,如果说出现了异常,我们这段代码他最终执行的效果是怎样的呢?比如说用户信息这边,我假设执行一秒之后,我就抛了一个空指针的 啊,这是在我们业务开发的时候,应该是很正常的一件事情了,对不对?那么抛了控制在异常之后,我们再回到我们调用的代码,比如说先开始执行这两个任务,那么这里就过去等待用户的信息,那么这里应该就会抛异常,对吧?一秒之后就会抛异常,那么关键是订单信息这边他到底会不会执行完呢?好,我们先来看预警结果。 好,这两个没问题。哎,这里确确实实呢也抛了异常,但是我们发现订单其实是没有受到任何影响的,就算你 use 这边执行时候出现的错误,订单他还是会正常的去执行的,但是像我们当前需求里面,对于这种执行他有没有意义呢?啊?其实 在我们需求背景下面可能就没有太大的意义,因为我们是希望啊,拿到两个正常的结果之后,进行数据的组装,然后返回给前端。那既然你现在拿不到用户信息,那么其实订单信息呢,你也没有必要要返回给我了,或者说你们也没有必要要继续的执行下去了。 好,这是我们目前现成池在执行某些需求的时候可能会遇到的问题啊,那么这种问题我们有没有办法去解决呢?啊?这个问题我再强调一遍,就是如果当我这里的两个任务其中有一个任务执行失败了,那么另外这个任务你也没有必要要去继续执行下去了。那么怎么做呢?这就需要用到我们的结构化并发,也就是下面的代码。 我们先来看一下,好像代码结构上面是差不多的啊,也是一行代码好像去构造一个什么东西,然后呢?好像去添加了两个任务,然后呢就去拿任务的结果,然后呢去呃组装数据,对吧?好,但是呢,这里其实意义完全不一样,我们并不能把这一行代码理解为也是在构造一个现任词啊,这里其实就是在构造一个结构化任务,你可以把它理解为就是一个大任务, 然后我基于这个大任务,我就去复刻出来了两个指任务啊,然后呢我就去呃交引这个大任务,交引大任务的效果其实就是等待这两个指任务执行结束,那么交引完之后我就可以去拿这两个指任务的执行结果,然后去组装数据返回啊,这是我们。 嗯,就暂时可以这么理解。好,那么我们就先来把我们的任务啊,把它改成正常的,我们先测试一下,看他能不能正常的执行我们的任务,比如说改正常之后我们来运行,所以这一次运行的效果应该跟我们之前现在只运行的效果应该是一模一样的啊,我发现确确实实呢,也是一模一样,对吧?好,那现在,呃,我们再把刚刚说的用户就是这个任务把它 改成出错啊,执行一秒之后抛一个空子的异常,那么他能不能满足我们刚刚的需求呢?就是我现在执行用户任务肯定会失败,那么你订单任务你难道就不执行了吗?好,我们来跑一下,我发现订单任务一开始还是执行,但是后面就出现了一个异常,这个异常很明显呢,就是我们这里抛的就是在执行用户任务的时候, 他其实就跑了一场,一秒之后跑了一场,但是呢,我们的订单其实就也没有继续的执行下去了,哎,这就是我们想要看到的效果,但这个效果他怎么实现的?我们马上来分析。我们先看效果好,这只是其中一种效果,这个效果就解决了我们尴尬的问题。但是大家注意这个结结构化任务他好像还有不同的啊,一个子类啊,也不算是子类吧,有有一个不同的类型。 对啊,确实啊,这里其实有两种类型,我们这里用的是其中一种,还有一种呢,就是下档 success。 好,我们先来看刚刚这个它的意思是什么?它的意思其实就是当我的这个大任务下面的某个子任务如果执行失败了, 那么整个任务其实也就会执行失败,整个大任务也就会执行失败。或者说当我的某个子任务执行失败了,另外的子任务他也不会继续执行了,这就是他的意义。就像我刚说的,我们执行用户任务失败了,订单这个任务他虽然一开始呃也开始执行了,但是呢,只要说你订单任务在执行的时候出现了任何错误,我的呃用户任务执行的时候出现了任何错误,我的订单任务他会密码的终止。那么为什么能够 终止掉正在执行的一个任务呢?这其实就跟虚拟县城有关系,因为这里 fork 去执行这个任务的时候,他其实利用的就是虚拟县城。那什么是虚拟县城?大家如果说感兴趣可以去到我的首页,我上个视频就讲的什么是虚拟县城, 好,那么这是其中一种类型,我刚说了,其实还有另外一种类型,就是下蛋红 c x s, 它跟尴尬的其实就相反,它的意思是如果当我的某个指任务执行成功了,那么谁先只要有一个指任务 执行成功了,那么其他的子任务也不会执行了啊。比如说我这里来验证一下,我们现在就不去跑异常了,我们就直接执行成功。但是呢,我用户任务我执行一秒,我就让他成功了,但是我 word 的任务我要执行三秒才能成功,那么就先这个代码。按照我刚刚的分析,应该就是用户任务会先执行完,但是订单任务你就不会执行了,这是他的 意义。就当其中某一个指任务执行完成了,另外的指任务他就不会继续执行了。你看他这里给的任务,指任务没有完成,或者说没有完成成功,就是我们的 word 任务他其实没有执行完 啊,所以就是因跟我们这里的配置是有关系的,所以这就是我们结构化并发的精髓。他相当于我们可以去定义一个大任务,然后呢去复刻出来多个子任务,那我们可以去控制啊,当某个子任务执行成功或者执行失败之后,其他的子任务你到底该不该执行,这就是他的精髓。 所以这就是我们的结构化并发。但还有很多其他的 api, 大家如果说感兴趣可以关注一下我的呃工作号,到时候呢,我可以把其他的 api 整理一下,通过文章的形式来分享给大家。当然我们结构化并发呢,它并不是用来去 替换我们的线层词的,大家注意他们两个有各自的不同的需求场景的好,当然结构化并发我刚讲了,他底层是用到了虚拟线层的,所以这个其实也是很重要的, 所以呢,那关于结构化并发我今天就分享到这里,我下个视频会继续给大家来分享另外一个 j d k 二十一里面的新特性,那么会是什么呢?大家可以猜一下,今天就讲到这里,希望能得到大家的一箭三连,谢谢大家的观看。

如果你们做新项目,你们会选 j d k。 的哪个版本呢? j d k。 二十在二零二三年三月二十一日正式发布。 你还在用 gdk 八吗?为什么不是其他版本呢?如果你做基础选型,你会选择哪个版本呢? 如果我选,我会选择 gdk 十一、 gdk 十七和今年九月即将发布的 gdk 二十一。 因为这三个版本都是 jdk lts 版本。 lts 是指长期支持版本,这些版本在发布后会获得至少五到八年的支持,适用于生产环境。 例如, j d k。 八十一都是 l t s 版本。 s t s 是指短期支持版本。这些版本在六个月会发布一个 新版本,每个版本在发布后只获得六个月的支持,适用于开发环境,体验新特性。例如, gdk 十二到二十都是 sts 版本。 oracle 的 j d k 版本发布规则是这样的,每三年发布一个新的 l t s 版本,例如八十一、十七。那在两个 l t s 版本之间呢?会发布若干个 s t s 版本。 j d k。 十二到十六。 j d k 十九到二十。 那 l t s 版本发布后,前一个 l t s 版本会结束。常规支持,只有 l t s 版本才会发布对应的 open g d k 版本。另外, s t s 版本主要用于开发环境,体验新特性, 生产环境不建议使用。所以简单来说, oracle g d k 的 l t s 版本才是生产环境首选,而 st s 版本更适用于开发与测试环境。 如果你的项目重视稳定性和长期支持,建议选择 l t s 版本,例如当前的 g d k。 十一和 g d k。 十七,还有今年即将出的 g d k。 二十一。 如果你只是想尽快体验到 java 的新特性,比如你自己做了一些为了学习和闭舍的这种一次性项目,也可以选择最近的 sts 版本,例如 gdk 十九或者二十,但是需要注意他们的支持时间比较短, 所以 l t s 版本是你 java 生产项目的稳定之选,而 s t s 版本 可以满足开发测试环境、体验新特性的需求。两种版本各有优势,需要根据具体使用场景进行选择。如果你想了解到一些 gadk 的新特性,可以看一下我左下角的 jdk 版本新特性讲解的课,将来每个 jdk 的 lts s 的版本我都会详细介绍。当然你也可以自己上奥瑞口官方网站上去了解更多的详细信息关注我,一个分享干货的技术博主。

最近 j d k。 二十一已经正式发布了,我认为新版本 j d k 最炸裂的两个特性就是支持虚拟县城和分代 z g c。 虚拟县城从 j d k。 十九开始一直吆喝,终于在 j d k。 二十一现征身。官方介绍说,虚拟县城会开启并发编程的新大门,清亮且高效,用更少的开销,处理更多的任务。 之前版本的 z g c 是不支持分代的,在 j d k。 二十一的新版本中提供了分代 z g c 的功能,从而提高应用程序的性能,降低对内存开销和程序停顿的风险。 除了以上两个划时代的新特性, j d q 十一还将支持 record 模式、新的十位器匹配语法顺序、几何字、不串模板等,以及看起来不那么有用的内函数新写法。那么你会为了这些新特性去升级 j d k 版本吗? 短期内应该还是版本任他发我用交啊吧。对程序员最大的影响就是要多准备几道面试题而已。身为程序员,每天上班坐着敲代码,下班还要坐着刷面试题,久而久之,肩颈、腰椎或多或少会存在一些问题, 抵抗力越来越差。养生问题不容忽视,在光谷附近上班的程序员有福利了。最近朋友推荐了一家非常不错的店养生帮,店里先进的理疗设备太具有科技感。 体验了一把 ai 中医麦诊仪,一分钟内检测完六十四项身体指标,检查出来的亚健康状态非常准确,和医院体检结果一模一样。报告由专业的中医帮忙解读, 即使了解个人的身体状况,并给出合理的调理方案,最后体验完两个项目,整个人轻松了不少。最近店里刚好有活动,优惠力度非常大,赶快点击上面的链接囤一波吧,后面身体有啥不舒服,随时可以去店里做个理疗。

今天学习安装 jdk, 首先,下载 jdk 第一步,启动浏览器第二步,打开 oracle 页面第三步,切换解题中文第四步,点击产品第五步,点击加瓦第六步,点击下载加瓦第七步,点击 八步,点击 windows 第九步,点击链接开始下载。行,太快了,你先告诉我你怎么知道要下载这个?首先,我们看到这里有 二幺和幺七两个数字,这表示 jdk 的版本号,数字越大则说明版本号越高,版本号越高则说明他就越新,所以我们这里选择最新版二幺。 其次,我们看到这里有 jdk 和 gravim for jdk, 后者 gravim for jdk 比 jdk 功能更强大,性能更好,所以我们选择 gravim jdk。 最后,这里是选 要安装在两个操作系统上,这里分别有 linux、 苹果操作系统和 windows, 而我们的电脑是 windows, 所以我们选择了 windows 下的安装包,这就是为什么要停,别墨迹了,继续吧。 ok, 我们现在进行第二部分解压安装。 第一步,选择钢材我们下载好的安装包文件。第二步,单击鼠标右键,选择解压文件。 三步,选择要安装到哪个目录下去就解压到哪个目录下去,我们这里选择解压到底盘 program file 目录下。 第四步,把文件改的名称改一个自己喜欢的名字,当然也可以不用改,此时就解压安装完成,下面执行第三部分配置环境变量,在左侧使电脑图标上右键鼠标选择属性,然后点击高级系统设置,选择高级选项卡, 选择环境变量。在下方系统环境变量区域里找一下有没有变量名称,叫做加哇下滑向 home 的环境变量,如果有的话就选中他点编辑,如果没有就直接点下面的新建按钮。变量名输入大写的加哇下滑向 home 变量值就是接力 k 安装到哪个目录下的,注意这里的目录路径是选择 gdk 里是选择到 gdk 的并目录所在的, 然后点击确定,这样加完 home 环境变量我们就配置好了。然后再在系统环境变量里面选中 pass 变量,点击下面的编辑按钮,再点击新建按钮,输入百分号,加完下滑线 home 百分号斜杠 bin, 然后选中 该直,把它上移到最前面,然后点击确定,点击确定,点击确定我靠什么东西,这样 我们的环境变量就配置完成了。第四部分我们来验证一下我们这个安装是否正确。在桌面空白处点击鼠标右键,在右键菜单中选择在终端中打, 我们打开一个新的命令提示符,然后在命令窗口中输入命令,加瓦空格杠 version 回车,如果能显示出加瓦的版本号,则表示安装成功。此时你已经掌握了在 windows 上安装 gdk 的方法。 恭喜你,已经停。别恭喜了,你这个方式看上去有点 low 啊,有没有那种看上去感觉很厉害的那种安装方式介绍一下。 当然有。演示之前我们先把刚才按的 kdk 卸载掉,卸载的方式非常简单,就是移除环境变量就可以了。其次点击高级系统,设置高级选项卡环境变量,在系统环境变量中选中 pass 变量,点击边键有选中加完后面的字,点击删除,点击确定。选中加完后面的环境变量, 点击删除,点击确定,再次点击确定,再将 jdk 安装目录刚才的解压包删掉,卸载完成。我靠 什么东西?接下来给大家演示一下,用命令行来进行安装,就三步,第一步,解压,第二步,配置环境变量。第三步,验证安装是否正确。在 windows 搜索框中搜索 powerseer, 选择以管理员方式运行, 这里只能是 power 线,不能是 cmd, 必须是以管理员方式运行,否则无法使用 windows 内置的解压命令解压文件,然后执行 extend 命令进行解压,使用 mv 命令进行改名, 然后回到桌面,在设置官方搜索 c m d, 然后选择以管理员身份运行,注意必须是 c m d, 必须以管理员身份运行,否则无法执行设置环境变量的命令,使用 set x 命令设置。加完 home 环境变量,使用 set x 命令设置 pass 环境面料, 安装完成。验证一下,回到桌面,开始运行,输入 cmd, 启动一个新的命令行窗口,然后输入命令 java 空格 version 回车显示出版本号,表示安装完成。安装正确。我靠什么东西? 点赞关注不迷路!