JVM笔记-黑马-1

2023-11-09

文章目录

视频资源地址

B站 https://www.bilibili.com/video/av70549061

笔记资源地址

https://www.bilibili.com/video/av70549061

我的笔记

1.什么是JVM

定义:Java Virtual Machine,JAVA程序的运行环境(JAVA二进制字节码的运行环境,将class文件通过类加载器加载到jvm中)。
好处

  • 一次编写,到处运行的基石。jvm屏蔽了字节码跟底层操作系统之间的适配兼容关系,对外提供了一致的运行环境
  • 自动内存管理,垃圾回收机制。当然现在很多语言都有垃圾回收机制了,但是java刚出的那个年代,对标的是c++这种语言,他们是自己管理内存的(malloc函数),程序员不小心就会内存泄漏。
  • 数组下标越界检查,会跑异常,不会在内存级别进行覆盖其他内存中的内容。
  • 多态,使用虚方法表的机制实现的多态。
    比较:JVM JRE JDK的区别,逐级向上包含的关系。
    在这里插入图片描述

2.学习jvm的作用

1.面试。提升面试竞争力。
2.帮助理解底层的实现原理。
3.中高级程序员的必备技能。比如遇到内存溢出,响应时间缓慢,很多时候这种问题与jvm相关。

3.常见的jvm

jvm是一套规范,很多公司遵循这套规范开发了自己的jvm。使用的时候,需要注意,有使用许可的,比如hotspot,需要商业许可。可以用openjdk替换掉。阿里也有自己的jdk。下文中的内容都是针对hotspot的实现来讲的。
在这里插入图片描述

4.学习路线

在这里插入图片描述
jvm分成3部分:类加载器、java内存结构、执行引擎三部分。
一个类从java源代码编译为class文件(二进制字节码)以后,必须经过类加载才能被加载到jvm里。类都是放在方法区,类将来创建的实例是放在堆的部分,堆里面这些对象,在调用方法时,又会用到虚拟机栈、程序计数器、本地方法栈。方法执行时,是由每行代码中的解释器逐行进行执行,热点代码(频繁调用的代码)会由JIT进行一个优化后的执行。GC会对堆中一些不再被引用的对象进行垃圾回收。对于一些java代码不方便实现,必须调用底层操作系统的功能,就需要借用本地方法接口来调用操作系统提供一些功能方法。

5.内存结构·程序计数器·作用

案例引入:二进制字节码 vs java源代码

在这里插入图片描述
作用:用于保存JVM中下一条所要执行的指令的地址。
从物理上,实现程序计数器,是通过寄存器来实现的。上图中的jvm指令前面的数字(0,3,4…),就是指令的地址。寄存器是cpu读取最快的单元。

6.内存结构·程序计数器·特点

  • 线程私有,每个线程都有自己的程序计数器。
    1.CPU会为每个线程分配时间片,当当前线程的时间片使用完以后,CPU就会去执行另一个线程中的代码
    2.程序计数器是每个线程所私有的,当另一个线程的时间片用完,又返回来执行当前线程的代码时,通过程序计数器可以知道应该执行哪一句指令
  • 不会存在内存溢出,唯一一个。堆栈方法区都会存在内存溢出。

7.内存结构·虚拟机栈

栈的数据结构的特点:先进后出。
虚拟机栈就是线程运行时需要的内存空间。每个线程都有自己的内存空间。
栈中的执行单元叫做栈帧。
在这里插入图片描述
简单理解,一个栈帧就是一次方法的调用。栈帧是每个方法运行时需要的内存。
栈帧中有什么:参数,局部变量,返回地址。

8.内存结构·虚拟机栈的演示

在这里插入图片描述
代码举例:
在这里插入图片描述
使用idea的debug运行。在debug界面,可以看到栈帧的情况,以及栈帧中的参数、局部变量的情况。
在这里插入图片描述
在栈顶部的那个栈帧叫做活动栈帧,一般是正在执行的那个方法所用的内存空间。

9.内存结构·虚拟机栈问题辨析1

在这里插入图片描述
1.垃圾回收不需要涉及栈内存。因为栈帧内存在方法执行完毕之后会自动的弹出栈被回收掉。所以根本不需要垃圾回收来管理栈内存。垃圾回收只是回收堆内存中的无用对象。
2.通过Xss可以设置栈的大小,如下图。栈内存越大,反而会让你的线程数变少。因为物理内存的大小是一定的,单位内存越大,能分配的单位的数量越少。栈的空间大了,能支持更深的方法调用,而不会增加整体的执行效率。
在这里插入图片描述
总结:一般采取系统默认的栈的大小就可以了。

10.内存结构·虚拟机栈问题辨析2 线程安全

在这里插入图片描述

是否线程安全只需要考虑,这个变量是多个线程共享的还是一个线程私有的。这里的问题3答案是不会。因为一个线程对应一个栈帧,一个栈帧中有自己的局部变量,是线程私有的,不是共享的,因为局部变量的位置在栈中,而栈又是线程私有,所以间接的局部变量也是线程私有的,是线程安全的。
如果改成static的全局变量,就不是线程安全了!
在这里插入图片描述

11.内存结构·虚拟机栈问题辨析2 线程安全

在这里插入图片描述
m1:线程安全,因为完全是局部变量完成了操作,不与外界有任何的交集,绝对的线程安全。
m2:线程不安全,因为方法执行的时候,因为传参是一个对象,会有别的线程访问到它。参数不是线程私有的一个对象,所以线程不安全。如下图的调用方式,m2的参数在主线程被使用了。在这里插入图片描述
m3:也不是线程安全的,因为对象被返回了,其他方法也可以拿到引用去修改。实际上是逃离了方法的作用范围,就管不住了,逃逸分析。

  • 方法内的局部变量是否是线程安全的?
    1.如果方法内局部变量没有逃离方法的作用范围,则是线程安全的
    2.如果如果局部变量引用了对象(基本类型不会),并逃离了方法的作用范围,则需要考虑线程安全问题。

12.内存结构·栈 内存溢出1

Java.lang.stackOverflowError 栈内存溢出产生的原因?
1.栈的大小固定,栈帧的数量过多,超出了栈的内存,导致栈内存溢出。一般递归的时候操作不当会触发栈内存溢出。
2.栈帧过大,也会导致栈内存溢出。
案例1:栈帧过多导致内存溢出
在这里插入图片描述
代码没有设置递归终止条件。通过设置jvm参数来更快的触发栈内存溢出的异常。
在这里插入图片描述

13.内存结构·栈 内存溢出2

stackoverflow 异常不只是你的代码会产生,很多第三方的库也会引起这个异常。
案例分析:员工与部门对象,分别持有对方的引用。
在这里插入图片描述
运行结果如下:
在这里插入图片描述
原因是因为在转化为对象影射的时候,产生无穷的递归调用。
解决方案:加注解,双向关联改成单向。
在这里插入图片描述

14.线程诊断案例·cpu占用高

java进程占用cpu高,是一个很危险的信号,如下图所示:
在这里插入图片描述
如何分析呢?
top命令只能定位到哪个进程占用的cpu多,并不能定位到线程。使用ps命令,全部命令如下:
ps H -eo pid, tid), %cpu
参数解释:
H :打印进程的线程数
pid:进程id
tid:线程id
%cpu:cpu占用
会打印:
在这里插入图片描述
这时候打印的会比较多,可以使用grep 命令限制输出的进程。
ps H -eo pid, tid), %cpu | grep 进程号
结果如下,内容被减少了,留下了java进程的线程占用cpu的情况:
在这里插入图片描述
使用这个命令之后,再使用jstack打印一下java进程的每个线程的信息。
在这里插入图片描述
threadN这种进程是用户线程,系统线程都有规范的名字。刚才用ps命令已经找到了出问题的线程是哪个了。
但是在java中线程编号使用的是16进制,需要换算一下。换算出之后,对比一下nid,就可以定位到出问题的代码了。
在这里插入图片描述

看一下问题代码,如下,是因为空循环导致cpu占用高。
在这里插入图片描述

15.线程诊断案例·迟迟得不到结果

迟迟得不到结果,有一种可能是死锁了,先排除这个还是用jstack排查。先找到java进程,然后jstack 进程号。
很简单的死锁,jstack会发现。并且在最后给你输出出来。
在这里插入图片描述
看一下代码实现:
在这里插入图片描述
拿着竞争资源,然后等待对方的竞争资源,形成了死锁。

16.本地方法栈

在这里插入图片描述
本地方法栈,类似于虚拟机栈,是虚拟机在调用本地方法的时候提供的内存空间。
举个例子,什么是本地方法,比如object类中的clone方法。
在这里插入图片描述

17.堆·定义

栈是线程私有的,堆是线程共享的。
在这里插入图片描述

18.堆·堆内存溢出问题

在这里插入图片描述
堆,是有垃圾回收机制的,但是当对象一直有引用就无法被回收,当对象越来越多,空间不够,也就发生内存溢出了。报错信息如下:OOM异常。
在这里插入图片描述
tips:使用Xmx来限制最大堆空间
在这里插入图片描述
技巧:排查内存泄漏问题,可以把堆内存设置的小一点,容易早点暴露问题。

19.堆·堆内存诊断工具jps

在这里插入图片描述
jps是可以帮你把java进程过滤出来。
jmap的限制在于只能看到某一时刻的堆内存占用情况,不能时序显示变化。
演示堆内存占用的代码:程序运行过程中增加堆中的对象占用情况,先增加后释放。
在这里插入图片描述
调试过程:
1.首先使用jps确认java进程号
在这里插入图片描述
2.使用jmap -heap 进程号命令 检测堆内存占用情况。
在这里插入图片描述
3.分别在三个时间点,抓取内存快照信息。分别是程序刚启动,申请完了内存,释放了内存三个节点。
第一个时间点:Eden区使用了6m,还没有申请10m的空间。
在这里插入图片描述
第二个时间点,申请了10m的空间。内存占用到了16m,就是新创建的数组占用的内存。
在这里插入图片描述
第三个节点,释放了byte数组。空间明显缩水了。
在这里插入图片描述

20.堆·堆内存诊断工具jconsole

在这里插入图片描述
在这里插入图片描述
还是把刚才的程序跑起来,使用不安全的链接,监控刚才的java进程。
能明显的看到堆内存的变化情况。
jstack的检测死锁的功能,jconsole也是带的。
在这里插入图片描述

21.堆·堆内存诊断工具jvisualvm

在这里插入图片描述
这种情况,怎么分析呢?使用jvirsualvm。先用他连接上java进程。
在这里插入图片描述
使用堆dump功能,可以抓取堆的快照,可以对堆中的详细内容进行分析。
在这里插入图片描述
可以查看有哪些对象占用的空间比较大,有哪些对象。使用右侧的检查功能,可以查找出大对象。
在这里插入图片描述

可以点击进去查看对象的细节内容。
在这里插入图片描述
基本也能定位出问题了。结合业务分析一下,就能降下去了。
再回看一下源代码:
在这里插入图片描述

22.方法区·定义

在这里插入图片描述
基于jdk1.8,官方给的定义。java方法区是所有的java虚拟机线程共享的区域。它存储了跟类的结构相关的一些信息,比如运行时常量池、成员变量,方法数据,成员方法,构造器方法,包括特殊方法。方法区在虚拟机启动时被创建,逻辑上方法区是堆的组成部分,但是jvm厂商在实现的时候不一定遵守,这个规范并不强制方法区的位置。方法区是规范,1.8之前的永久代(堆上),1.8之后的元空间(基于直接内存)都是具体实现。方法区也会出现内存不足的情况。
在这里插入图片描述

jdk 1.8的常量池 就不放在方法区了,而是放在堆里面。

23.方法区·内存溢出问题

案例代码:
在这里插入图片描述
不加jvm参数,在jdk1.8中往内存里放,是看不出来效果的,因为直接内存一般都够。需要加虚拟机参数,设置元空间的大小。
加入限制之后,报错如下:
在这里插入图片描述
演示jdk1.8以前的方法区溢出,不同的点在于方法区的实现变成了永久代。
在这里插入图片描述
报错如下:
在这里插入图片描述
在这里插入图片描述

24.方法区·内存溢出问题2

实际场景中,我们动态产生class并加载这些类的场景是非常多的!
各种框架中都用到了字节码技术,比如cglib。
在代理技术中广泛的使用了字节码的生成技术。比如cglib打开之后的,截图如下:
在这里插入图片描述
在这里插入图片描述

框架会有很多动态加载的过程。

25.方法区·运行时常量池

在这里插入图片描述

一个最简单的hello world。二进制字节码包括了三部分:类基本信息,常量池,类方法定义。
在这里插入图片描述
可以将上述代码的class利用javap -v class文件 进行反编译。验证是否三部分。
在这里插入图片描述

首先是,类的基本信息。
在这里插入图片描述

然后是常量池:里面都是一些地址+一些符号。
在这里插入图片描述
再往下,就是方法定义了。里面有虚拟机的指令了。能看到默认的空构造。
在这里插入图片描述
在这里插入图片描述
后面的#2,#3,可以去常量池中查找具体指什么。
常量池中,也有互相跳的,就能找到具体执行了什么。
常量池的作用,简单理解为就是给虚拟机指令提供常量符号。

26.方法区·运行时常量池

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JVM笔记-黑马-1 的相关文章

  • Grails 3.x bootRun 失败

    我正在尝试在 grails 3 1 11 中运行一个项目 但出现错误 失败 构建失败并出现异常 什么地方出了错 任务 bootRun 执行失败 进程 命令 C Program Files Java jdk1 8 0 111 bin java
  • Java Swing:从 JOptionPane 获取文本值

    我想创建一个用于 POS 系统的新窗口 用户输入的是客户拥有的金额 并且窗口必须显示兑换金额 我是新来的JOptionPane功能 我一直在使用JAVAFX并且它是不同的 这是我的代码 public static void main Str
  • 在 java 类和 android 活动之间传输时音频不清晰

    我有一个android活动 它连接到一个java类并以套接字的形式向它发送数据包 该类接收声音数据包并将它们扔到 PC 扬声器 该代码运行良好 但在 PC 扬声器中播放声音时会出现持续的抖动 中断 安卓活动 public class Sen
  • 给定两个 SSH2 密钥,我如何检查它们是否属于 Java 中的同一密钥对?

    我正在尝试找到一种方法来验证两个 SSH2 密钥 一个私有密钥和一个公共密钥 是否属于同一密钥对 我用过JSch http www jcraft com jsch 用于加载和解析私钥 更新 可以显示如何从私钥 SSH2 RSA 重新生成公钥
  • 使用 Android 发送 HTTP Post 请求

    我一直在尝试从 SO 和其他网站上的大量示例中学习 但我无法弄清楚为什么我编写的示例不起作用 我正在构建一个小型概念验证应用程序 它可以识别语音并将其 文本 作为 POST 请求发送到 node js 服务器 我已确认语音识别有效 并且服务
  • 制作一个交互式Windows服务

    我希望我的 Java 应用程序成为交互式 Windows 服务 用户登录时具有 GUI 的 Windows 服务 我搜索了这个 我发现这样做的方法是有两个程序 第一个是服务 第二个是 GUI 程序并使它们进行通信 服务将从 GUI 程序获取
  • Final字段的线程安全

    假设我有一个 JavaBeanUser这是从另一个线程更新的 如下所示 public class A private final User user public A User user this user user public void
  • 控制Android的前置LED灯

    我试图在用户按下某个按钮时在前面的 LED 上实现 1 秒红色闪烁 但我很难找到有关如何访问和使用前置 LED 的文档 教程甚至代码示例 我的意思是位于 自拍 相机和触摸屏附近的 LED 我已经看到了使用手电筒和相机类 已弃用 的示例 但我
  • 如何为俚语和表情符号构建正则表达式 (regex)

    我需要构建一个正则表达式来匹配俚语 即 lol lmao imo 等 和表情符号 即 P 等 我按照以下示例进行操作http www coderanch com t 497238 java java Regular Expression D
  • Java TestNG 与跨多个测试的数据驱动测试

    我正在电子商务平台中测试一系列商店 每个商店都有一系列属性 我正在考虑对其进行自动化测试 是否有可能有一个数据提供者在整个测试套件中提供数据 而不仅仅是 TestNG 中的测试 我尝试不使用 testNG xml 文件作为机制 因为这些属性
  • 在两个活动之间传输数据[重复]

    这个问题在这里已经有答案了 我正在尝试在两个不同的活动之间发送和接收数据 我在这个网站上看到了一些其他问题 但没有任何问题涉及保留头等舱的状态 例如 如果我想从 A 类发送一个整数 X 到 B 类 然后对整数 X 进行一些操作 然后将其发送
  • 总是使用 Final?

    我读过 将某些东西做成最终的 然后在循环中使用它会带来更好的性能 但这对一切都有好处吗 我有很多地方没有循环 但我将 Final 添加到局部变量中 它会使速度变慢还是仍然很好 还有一些地方我有一个全局变量final 例如android Pa
  • 仅将 char[] 的一部分复制到 String 中

    我有一个数组 char ch 我的问题如下 如何将 ch 2 到 ch 7 的值合并到字符串中 我想在不循环 char 数组的情况下实现这一点 有什么建议么 感谢您花时间回答我的问题 Use new String value offset
  • 无法捆绑适用于 Mac 的 Java 应用程序 1.8

    我正在尝试将我的 Java 应用程序导出到 Mac 该应用程序基于编译器合规级别 1 7 我尝试了不同的方法来捆绑应用程序 1 日食 我可以用来在 Eclipse 上导出的最新 JVM 版本是 1 6 2 马文 看来Maven上也存在同样的
  • Java列表的线程安全

    我有一个列表 它将在线程安全上下文或非线程安全上下文中使用 究竟会是哪一个 无法提前确定 在这种特殊情况下 每当列表进入非线程安全上下文时 我都会使用它来包装它 Collections synchronizedList 但如果不进入非线程安
  • 如何从泛型类调用静态方法?

    我有一个包含静态创建方法的类 public class TestClass public static
  • 声明的包“”与预期的包不匹配

    我可以编译并运行我的代码 但 VSCode 中始终显示错误 早些时候有一个弹出窗口 我不记得是什么了 我点击了 全局应用 从那以后一直是这样 Output is there but so is the error The declared
  • 有没有办法为Java的字符集名称添加别名

    我收到一个异常 埋藏在第 3 方库中 消息如下 java io UnsupportedEncodingException BIG 5 我认为发生这种情况是因为 Java 没有定义这个名称java nio charset Charset Ch
  • 使用 JMF 创建 RTP 流时出现问题

    我正处于一个项目的早期阶段 需要使用 RTP 广播DataStream创建自MediaLocation 我正在遵循一些示例代码 该代码目前在rptManager initalize localAddress 出现错误 无法打开本地数据端口
  • JGit 检查分支是否已签出

    我正在使用 JGit 开发一个项目 我设法删除了一个分支 但我还想检查该分支是否已签出 我发现了一个变量CheckoutCommand但它是私有的 private boolean isCheckoutIndex return startCo

随机推荐

  • 60分钟学pytorch

    本文会持续更新 直至完成pytorch中的60分入门文档部分 目前为tensor的基础操作部分 本文代码github https github com amazingzby pytorch tutorial pytorch官方文档给初学者提
  • ui(new Ui::MainWindow)

    用最新的QtCreator选择GUI的应用会产生含有如下文件的工程 下面就简单分析下各部分的功能 pro文件是供qmake使用的文件 不是本文的重点 不过其实也很简单的 在此不多赘述 所以呢 还是从main开始 include
  • Java基础-学习笔记(一)

    1 IT业务的发展变化 1 大型机 一代 IBM 2 PC Mac 二代 微软 苹果 3 互联网 三代 Google Baidu 4 移动互联网 谷歌 微软 苹果 所谓 移动互联网 移动通信 互联网 马云所属 IT到DT的变化 注 推荐本书
  • MATLAB的曲线拟合

    原文地址 MATLAB的曲线拟合 作者 睿吉jerry MATLAB软件提供了基本的曲线拟合函数的命令 曲线拟合就是计算出两组数据之间的一种函数关系 由此可描绘其变化曲线及估计非采集数据对应的变量信息 1 线性拟合函数 regress 调用
  • 智能合约简介

    链客 专为开发者而生 有问必答 此文章来自区块链技术社区 未经允许拒绝转载 当人们在讨论智能合约的时候他们到底在说什么 在区块链和加密货币的语境中 智能合约的定义是 在分布式存储平台 例如区块链 上存储并复制的 在计算机网络 通常是运行区块
  • 【qiankun】子应用的路由信息传给主应用,主应用使用this.$router.push跳转子应用页面

    前提 已经安装qiankun 并且子应用已经接入主应用 场景 主应用是vue2 子应用是vue3 子应用的路由文件router index ts 在这段后面加下列代码 const router createRouter history cr
  • VMware Workstation 无法连接到虚拟机。请确保您有权运行该程序、访问该程序使用的所有目录以及访问所有临时文件目录的解决方法

    VMware Workstation 无法连接到虚拟机 请确保您有权运行该程序 访问该程序使用的所有目录以及访问所有临时文件目录 这个问题刚刚用虚拟机的人可能会经常遇到 解决方法就是 在开始中搜索服务 点击服务正在本电脑运行 注意 这里演示
  • CloudCompare 二次开发(5)——非插件中的PCL环境配置(均匀采样为例)

    目录 一 概述 二 CMakeLists txt 三 源码编译 四 代码示例 五 结果展示 本文由CSDN点云侠原创 原文链接 爬虫网站自重 一 概述 在进行CloudCompare二次开发的时候 可以直接在CloudCompare的核心功
  • 推动政府数字化转型进入新阶段

    推动政府数字化转型进入新阶段 公司近两年比较关注数字化转型和金融科技 打算今年重点了解一下 在网上看到了一个文章 感觉还不错 转载到这里 本文转自人民政协网上的 推动政府数字化转型进入新阶段 1 国家政策 国务院近日发布的 十四五 数字经济
  • 智慧城市智慧零售受益于5G和AI双核驱动

    支付宝推出了刷脸支付 我们只需要对准摄像头让它把我们脸部的特征完全识别出来 然后就可以进行支付了 那么这种人脸支付会用在很多地方 很简单 我们去超市购物的时候 以往你要么用卡要么给现金 或者你掏出手机来支付 但是怎么也得输入密码或者按指纹
  • MySQL自增主键详解

    一 自增值保存在哪儿 不同的引擎对于自增值的保存策略不同 1 MyISAM引擎的自增值保存在数据文件中 2 InnoDB引擎的自增值 在MySQL5 7及之前的版本 自增值保存在内存里 并没有持久化 每次重启后 第一次打开表的时候 都会去找
  • chrome浏览器:您的连接不是私密连接,burp抓包

    问题 您的连接不是私密连接 处理 简简单单 跟着我来没错 不要浪费时间再找了 插件设置 SwitchyOmega 开启代理访问http burp CA下载证书 chrome flags Allow invalid certificates
  • 第3章 数据库结构设计

    3 1数据库概念设计 数据库概念设计主要解决数据需求 即如何准确地理解数据需求 真实地把应用领域中要处理的数据组织 定义描述清楚 以支持数据库设计后续阶段的工作 3 1 1概念设计的任务 数据库概念设计阶段的目标是 1 定义和描述应用领域涉
  • 2024王道数据结构P17No11

    一个长度为L L gt 1 的升序序列S 处在第L 2位置 向下取整 的数称为S的中位数 例如 序列S1 11 13 15 17 19 则中位数为15 两个序列的中位数是含他们所有元素的升序序列的中位数 例如 S2 2 4 6 8 20 则
  • 【毕业设计】深度学习身份证识别系统 - 机器视觉 python

    文章目录 0 前言 1 实现方法 1 1 原理 1 1 1 字符定位 1 1 2 字符识别 1 1 3 深度学习算法介绍 1 1 4 模型选择 2 算法流程 3 部分关键代码 4 效果展示 5 最后 0 前言 Hi 大家好 这里是丹成学长的
  • 学习总结7.1 Linux Rsh服务器

    在线安装是指不需要用户亲自下对应软件的包 但是需要对应系统能够访问互联网 不同的Linux系统使用不同的工具进行在线安装软件 常见的在线安装软件的工具如下所示 Ubuntu Debian系统使用apt get进行在线安装软件 Redhat
  • 动态粒子爱心,表白神器源码

    效果 https www douyin com user self modal id 7187722820967763237 源码 from tkinter import from matplotlib import pyplot as p
  • FCN的代码解读

    目录 模型初始化 VGG初始化 FCN初始化 图片的预处理 图片处理 图片编码 计算相关参数 模型训练 一个小问题 完整代码 参考 最近浅研究了一下关于图像领域的图像分割的相关知识 发现水还是挺深的 因为FCN差不多也是领域的开山鼻祖 所以
  • Android无线网络调试手机

    adb tcpip 5555 adb下载地址 http download clockworkmod com test UniversalAdbDriverSetup msi 3 在设备中下载超级终端 是andriod软件 设置端口 su s
  • JVM笔记-黑马-1

    文章目录 视频资源地址 笔记资源地址 我的笔记 1 什么是JVM 2 学习jvm的作用 3 常见的jvm 4 学习路线 5 内存结构 程序计数器 作用 6 内存结构 程序计数器 特点 7 内存结构 虚拟机栈 8 内存结构 虚拟机栈的演示 9