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 的相关文章

  • Java程序中的数组奇怪的行为[重复]

    这个问题在这里已经有答案了 我遇到了这个 Java 程序及其以意想不到的方式运行 以下程序计算 int 数组中元素对之间的差异 import java util public class SetTest public static void
  • Android Studio 在编译时未检测到支持库

    由于 Android Studio 将成为 Android 开发的默认 IDE 因此我决定将现有项目迁移到 Android studio 中 项目结构似乎不同 我的项目中的文件夹层次结构如下 Complete Project gt idea
  • JNI 不满意链接错误

    我想创建一个简单的 JNI 层 我使用Visual studio 2008创建了一个dll Win 32控制台应用程序项目类型 带有DLL作为选项 当我调用本机方法时 出现此异常 Exception occurred during even
  • Java8无符号算术

    据广泛报道 Java 8 具有对无符号整数的库支持 然而 似乎没有文章解释如何使用它以及有多少可能 有些函数 例如 Integer CompareUnsigned 很容易找到 并且似乎可以实现人们所期望的功能 但是 我什至无法编写一个简单的
  • Convert.FromBase64String 方法的 Java 等效项

    Java 中是否有相当于Convert FromBase64String http msdn microsoft com en us library system convert frombase64string aspx which 将指
  • 一种使用 Java Robot API 和 Selenium WebDriver by Java 进行文件上传的解决方案

    我看到很多人在使用 Selenium WebDriver 的测试环境中上传文件时遇到问题 我使用 selenium WebDriver 和 java 也遇到了同样的问题 我终于找到了解决方案 所以我将其发布在这里希望对其他人有所帮助 当我需
  • 序列化对象以进行单元测试

    假设在单元测试中我需要一个对象 其中所有 50 个字段都设置了一些值 我不想手动设置所有这些字段 因为这需要时间而且很烦人 不知何故 我需要获得一个实例 其中所有字段都由一些非空值初始化 我有一个想法 如果我要调试一些代码 在某个时候我会得
  • 在具有相同属性名称的不同数据类型上使用 ModelMapper

    我有两节课说Animal AnimalDto我想用ModelMapper将 Entity 转换为 DTO 反之亦然 但是对于具有相似名称的一些属性 这些类应该具有不同的数据类型 我该如何实现这一目标 动物 java public class
  • 如何将文件透明地传输到浏览器?

    受控环境 IE8 IIS 7 ColdFusion 当从 IE 发出指向媒体文件 例如 mp3 mpeg 等 的 GET 请求时 浏览器将启动关联的应用程序 Window Media Player 我猜测 IIS 提供文件的方式允许应用程序
  • 从 android 简单上传到 S3

    我在网上搜索了从 android 上传简单文件到 s3 的方法 但找不到任何有效的方法 我认为这是因为缺乏具体步骤 1 https mobile awsblog com post Tx1V588RKX5XPQB TransferManage
  • 反思 Groovy 脚本中声明的函数

    有没有一种方法可以获取 Groovy 脚本中声明的函数的反射数据 该脚本已通过GroovyShell目的 具体来说 我想枚举脚本中的函数并访问附加到它们的注释 Put this到 Groovy 脚本的最后一行 它将作为脚本的返回值 a la
  • 制作java包

    我的 Java 类组织变得有点混乱 所以我要回顾一下我在 Java 学习中跳过的东西 类路径 我无法安静地将心爱的类编译到我为它们创建的包中 这是我的文件夹层次结构 com david Greet java greeter SayHello
  • 尝试使用 Ruby Java Bridge (RJB) gem 时出现错误“无法创建 Java VM”

    我正在尝试实现 Ruby Java Bridge RJB gem 来与 JVM 通信 以便我可以运行 Open NLP gem 我在 Windows 8 上安装并运行了 Java 所有迹象 至少我所知道的 都表明 Java 已安装并可运行
  • 使用 AWS Java SDK 为现有 S3 对象设置 Expires 标头

    我正在更新 Amazon S3 存储桶中的现有对象以设置一些元数据 我想设置 HTTPExpires每个对象的标头以更好地处理 HTTP 1 0 客户端 我们正在使用AWS Java SDK http aws amazon com sdkf
  • 使用 Flyway 和 Hibernate 的 hbm2ddl 在应用程序的生命周期中管理数据库模式

    我正在开发 Spring Hibernate MySql 应用程序 该应用程序尚未投入生产 我目前使用 Hibernatehbm2ddl该功能对于管理域上的更改非常方便 我也打算用Flyway用于数据库迁移 在未来的某个时候 该应用程序将首
  • 应用程序关闭时的倒计时问题

    我制作了一个 CountDownTimer 代码 我希望 CountDownTimer 在完成时重新启动 即使应用程序已关闭 但它仅在应用程序正在运行或重新启动应用程序时重新启动 因此 如果我在倒计时为 00 10 分钟 秒 时关闭应用程序
  • Tomcat 6找不到mysql驱动

    这里有一个类似的问题 但关于类路径 ClassNotFoundException com mysql jdbc Driver https stackoverflow com questions 1585811 classnotfoundex
  • Keycloak - 自定义 SPI 未出现在列表中

    我为我的 keycloak 服务器制作了一个自定义 SPI 现在我必须在管理控制台上配置它 我将 SPI 添加为模块 并手动安装 因此我将其放在 module package name main 中 并包含 module xml 我还将其放
  • com.jcraft.jsch.JSchException:身份验证失败

    当我从本地磁盘上传文件到远程服务器时 出现这样的异常 com jcraft jsch JSchException Auth fail at org apache tools ant taskdefs optional ssh Scp exe
  • java8 Collectors.toMap() 限制?

    我正在尝试使用java8Collectors toMap on a Stream of ZipEntry 这可能不是最好的想法 因为在处理过程中可能会发生异常 但我想这应该是可能的 我现在收到一个我不明白的编译错误 我猜是类型推理引擎 这是

随机推荐

  • 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