JVM调优篇:探索Java性能优化的必备种子面试题
JVM内存模型
首先面试官会询问你在进行JVM调优之前,是否了解JVM内存模型的基础知识。这是一个重要的入门问题。JVM内存模型主要包括程序计数器、堆、本地方法栈、Java栈和方法区(1.7之后更改为元空间,并直接使用系统内存)。
正常堆内存又分为年轻代和老年代。在Java虚拟机中,年轻代用于存放新创建的对象,而老年代则用于存放生命周期较长的对象。具体而言,根据默认设置,年轻代和老年代的比例通常为1:2。也就是说,年轻代占整个堆内存的1/3,而老年代占2/3。这样的比例设置可以更好地适应不同类型的对象的内存需求,提高垃圾回收效率,从而优化程序的性能。具体默认比例如下:
JAVA类加载的全过程是怎样的?
类加载器:
APPClassLoader->ExtClassLoader->BooStrapClassLoader;
具体获取类加载的代码示例如下:
public class ClassLoaderExample {public static void main(String[] args) {// 获取当前类的类加载器(APPClassLoader)ClassLoader currentClassLoader = ClassLoaderExample.class.getClassLoader();System.out.println("Current ClassLoader: " + currentClassLoader);// 获取扩展类加载器(ExtClassLoader)ClassLoader extensionClassLoader = currentClassLoader.getParent();System.out.println("Extension ClassLoader: " + extensionClassLoader);// 获取引导类加载器(Bootstrap ClassLoader)ClassLoader bootstrapClassLoader = extensionClassLoader.getParent();System.out.println("Bootstrap ClassLoader: " + bootstrapClassLoader);}
}
什么是双亲委派机制及其作用
想知道双亲委派机制肯定需要对源码有一些了解,否则只能靠背,具体源码如下:
protected Class<?> loadClass(String name, boolean resolve)throws ClassNotFoundException{synchronized (getClassLoadingLock(name)) {// First, check if the class has already been loadedClass<?> c = findLoadedClass(name);if (c == null) {long t0 = System.nanoTime();try {if (parent != null) {c = parent.loadClass(name, false);} else {c = findBootstrapClassOrNull(name);}} catch (ClassNotFoundException e) {// ClassNotFoundException thrown if class not found// from the non-null parent class loader}if (c == null) {// If still not found, then invoke findClass in order// to find the class.long t1 = System.nanoTime();c = findClass(name);// this is the defining class loader; record the statssun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);sun.misc.PerfCounter.getFindClasses().increment();}}if (resolve) {resolveClass(c);}return c;}}
简单来说,双亲委派机制指的是当一个类需要被加载时,它的加载请求会被委托给它的父类加载器,父类加载器会先尝试加载这个类,如果加载成功就返回,如果加载失败则会将加载请求再委托给它的父类加载器,直到最顶层的启动类加载器(Bootstrap ClassLoader)。只有当最顶层的启动类加载器也无法加载时,才会由当前类加载器自己来进行加载。
使用双亲委派机制来加载类的好处是可以确保类的加载是由低层次的加载器向高层次的加载器进行委托,从而保证了类的唯一性和安全性。这样做可以避免出现java本地类被底层加载器加载的情况。
加载过程
分为三大部分: 加载 -》 连接 -》 初始化
加载(Loading)是指将类的字节码文件加载到内存中,并在方法区创建一个代表该类的Class对象。加载过程由类加载器完成。
连接(Linking)分为三个阶段:验证(Verification)、准备(Preparation)和解析(Resolution)。
-
验证(Verification):验证阶段主要对类的字节码进行验证,确保字节码的结构和语义是合法的。这个阶段主要包括以下几个方面的验证:文件格式验证、元数据验证、字节码验证和符号引用验证。
-
准备(Preparation):准备阶段是为类的静态变量分配内存空间,并设置默认初始值。这个阶段不会执行任何Java代码,只是简单地分配内存。
-
解析(Resolution):解析阶段是将类的符号引用替换为直接引用的过程。符号引用指的是用一组符号来描述所引用的目标,而直接引用是直接指向目标的指针、句柄或偏移量。解析阶段主要完成虚拟机对类、接口、字段和方法的解析。
初始化(Initialization)是类加载的最后一个阶段,主要是对类的静态变量进行赋值和执行静态代码块(实际上就是我们写的代码块)。初始化阶段是类加载的重要阶段,只有在初始化阶段才会真正执行类中的Java代码。初始化阶段由虚拟机自动触发,主要有两种情况:主动引用和被动引用。主动引用是指对类的主动使用,例如创建类的实例、访问类的静态变量和静态方法等。被动引用则是指对类的被动使用,不会触发类的初始化,例如通过子类引用父类的静态变量。
一个对象从加载到JVM,再到被GC清除,都经历了什么过程?
当一个对象从加载到JVM,再到被GC清除,它经历了以下过程:
-
加载:对象的类文件被加载到JVM中的方法区(也称为永久代或元空间),并在方法区中创建一个代表该类的Class对象。
-
申请空间:在对象生成之前,对象在堆内存中申请一块空间,对象的实例变量会被赋予默认初始值。
-
初始化:对象属性进行初始化。
-
连接:对象和栈中的引用建立连接,使得该对象可以被访问。
-
年龄划分:对象被分配到新生代的Eden区,并初始年龄为1。每个对象的年龄由对象头中的年龄标识位(通常是4位)表示,所以一个对象的最大年龄为15。
-
Minor GC:当新生代的Eden区空间不足时,会触发Minor GC。在Minor GC中,存活的对象会被复制到Survivor区域(通常是from区和to区),同时年龄会增加。经过多次复制和年龄增加后,对象会进入老年代。
-
Full GC:当老年代空间不足或者进行整体内存回收时,会触发Full GC。Full GC会对整个堆内存进行回收,包括新生代和老年代。
-
对象回收:经过GC后,不再被引用的对象会被GC清除,释放内存空间。
需要注意的是,当前方法结束,栈中的指针会先移除掉,当发生Full GC时,如果一个对象被回收,它的内存分配将会被清除,即该对象所占用的内存将被释放。
怎么确定一个对象到底是不是垃圾? 什么是GC Root?
有两种确认方法,一是引用计数法,二是根可达性算法;
引用计数法:每当一个对象被引用一次,它的引用计数就会加1,直到引用计数变为0时,该对象就被判定为垃圾对象。这是JDK 1.4之前使用的算法,但它存在一个明显的问题,即当两个对象相互引用时,它们的引用计数永远不会变为0,导致无法回收这些对象,进而可能导致内存泄漏和内存溢出问题。
根可达性算法:根可达性算法是目前主要使用的算法。它基于一个简单的概念,即从一组称为"GC Roots"的根对象开始,通过一系列引用关系来判断对象是否可达。如果一个对象无法通过任何引用关系与GC Roots相连,那么该对象就被判定为垃圾对象。一旦确定了没有连接到GC Roots的对象,垃圾收集器就会回收这些对象。
GC Roots包括类的静态变量、常量池、class类以及方法栈中的变量。这些对象被认为是程序的起始点,通过它们可以追溯到所有其他对象的引用关系。
JVM有哪些垃圾回收算法
MarkSweep:标记清除算法,目的是将垃圾标记后,直接清楚垃圾,这样会导致产生过多的内存碎片,当分配大对象时,可能会导致full gc,又或者直接内存溢出。
Copying:拷贝算法,拷贝算法(Copying)牺牲了一半的内存空间,只使用其中一半进行分配。在标记存活对象后,将对象整体迁移至另一半内存空间,减少内存碎片,但牺牲了可使用空间。
MarkCompack:标记压缩算法,为了解决拷贝算法的缺陷,就提出了标记压缩算法。这种算法在标记阶段跟标记清除算法是一样的,但是在完成标记之后,不是直接清理垃圾内存,而是将存活对象往一端移动,然后将端边界以外的所有内存直接清除。
JVM有哪些垃圾回收器?
Serial: 单线程垃圾回收器,使用复制算法。主要适用于小型应用程序和单核处理器。
Serial Old: 老年代单线程垃圾回收器,使用标记-整理算法。适用于较小的应用程序和单核处理器,对于大型应用程序可能会导致停顿时间较长。
ParNew: 年轻代多线程垃圾回收器,使用复制算法。与Serial相比,ParNew可以利用多个线程进行垃圾回收,提高回收效率。
Parallel Scavenge: 年轻代多线程垃圾回收器,使用复制算法。目标是尽可能地减少垃圾收集的停顿时间,适用于对系统吞吐量要求较高的应用程序。
Parallel Old: 老年代多线程垃圾回收器,使用标记整理算法。与Serial Old相比,Parallel Old可以利用多个线程进行垃圾回收,提高回收效率。
CMS: 老年代多线程并发垃圾回收器,默认使用标记清除算法,可配置标记整理算法。CMS的目标是减少垃圾收集的停顿时间,适用于对响应时间要求较高的应用程序。
G1: 基于分代的垃圾回收器,已去除物理上的年轻代和老年代概念。使用region块来保存和分配内存,整体上使用标记整理算法,微观上使用复制算法。G1的目标是在有限的时间内获得可控制的停顿时间,适用于大型应用程序和对响应时间要求较高的应用程序。
什么是STW
STW(Stop The World)是指在垃圾回收过程中,所有应用程序的线程都会被暂停,只有垃圾回收线程在执行垃圾回收操作。这意味着在STW期间,应用程序无法继续执行任何任务,可能会导致一些延迟和性能问题。
减少STW时间是垃圾回收优化的一个重要目标。JVM的垃圾回收器会不断进行优化,以减少STW时间,使应用程序的暂停时间尽可能短。不同的垃圾回收器有不同的优化策略和算法,以满足不同场景下的需求。
STW都发生在那些阶段
抛开单线程和多线程单一停顿时间不看,只看下CMS和G1垃圾回收器
CMS:共分为初始标记,并发标记,重新标记,并发回收四个阶段;其中初始标记和重新标记将会进行STW,但是拉开了STW的战线,所以总的停顿时间缩小了,但是由于他是在跟工作线程同时进行回收,所以肯定会产生浮动垃圾;
G1:共分为初始标记,并发标记,重新标记,筛选回收四个阶段;和CMS逻辑相同,但是筛选回收将会进行计算,jvm会判断回收成本并执行回收计划,来优先回收哪些对象
三色标记
三色标记是指将对象分为三个不同的颜色:白色、灰色和黑色。是CMS(Concurrent Mark Sweep)的标记算法
-
白色:表示对象未被访问过,也就是未被标记为存活对象。
-
灰色:表示对象已经被访问过,但它引用的其他对象还未被标记。
-
黑色:表示对象已经被访问过,并且它引用的其他对象也都被标记。
在并行标记阶段,CMS会先将根节点标记为灰色,然后并行地遍历对象引用,将引用的对象标记为灰色,并将其加入标记队列。当标记队列为空时,标记阶段结束。
然而,由于并行标记与应用程序执行是同时进行的,可能会导致在标记阶段结束后,仍然存在引用发生变化的情况,比如引用删除或引用转变。为了解决这个问题,CMS需要进行重新标记的过程。重新标记会遍历所有的灰色对象,并将它们标记为黑色。这样可以确保所有的引用关系都被正确地标记,并且不会错误地回收正在使用的对象。
如何进行JVM调优
JVM调优主要就是通过定制JVM运行参数来提高JAVA应用程度的运行数据
JVM参数有哪些
JVM参数大致可以分为三类:
- 标注指令: -开头,这些是所有的HotSpot都支持的参数。可以用java -help 打印出来。
- 非标准指令: -X开头,这些指令通常是跟特定的HotSpot版本对应的。可以用java -X 打印出来。
- 不稳定参数: -XX 开头,这一类参数是跟特定HotSpot版本对应的,并且变化非常大。详细的文档资料非常少。在JDK1.8版本下,有几个常用的不稳定指令:
- java -XX:+PrintCommandLineFlags : 查看当前命令的不稳定指令。
- java -XX:+PrintFlagsInitial : 查看所有不稳定指令的默认值。
- java -XX:+PrintFlagsFinal: 查看所有不稳定指令最终生效的实际值
JVM调优的开发者工具
JVM调优通常需要借助一些开发者工具来辅助。阿里开源的Arthas就是一款非常强大的Java诊断工具,它可以帮助开发人员进行实时的性能分析和问题排查。
Arthas具有丰富的功能,比如查看Java虚拟机的运行状态、监控方法执行时的参数和返回值、查看线程状态和运行时间、查看类加载和字节码等。它还支持在运行时修改类的方法体和实例状态,以及记录方法调用堆栈等功能。
使用Arthas,开发人员可以方便地发现性能瓶颈和问题,并进行针对性的优化。它在Java开发中非常受欢迎,尤其是在分布式系统和微服务架构中的性能调优中发挥了重要作用。
当然,除了Arthas,还有其他一些常用的JVM调优工具,比如VisualVM、JConsole、JProfiler等,开发人员可以根据自己的需要选择适合自己的工具来进行JVM调优。
官方文档地址: https://arthas.aliyun.com/doc/
总结
JVM调优确实不像开发中常见的可视化界面工具那样直观,而更多地需要基于底层的知识和经验来解决问题。JVM调优的确没有固定的定性规则,但可以根据一些常见的性能问题和优化思路来进行思考和回答。
在面试时,如果遇到JVM调优相关的问题,可以按照以下思路来回答:
-
首先,了解JVM的基本架构和垃圾回收机制。这包括堆、栈、方法区等内存结构,以及各种垃圾回收器的特点和工作原理。
-
掌握常见的性能问题和优化手段。例如,内存泄漏、频繁的Full GC、长时间的STW等问题,可以结合具体情况提出相应的解决方案。
-
熟悉一些性能监控和分析工具。如前面提到的Arthas、VisualVM、JConsole等,可以介绍自己使用过的工具,并举例说明如何利用这些工具进行性能分析和问题排查。
-
强调实践经验和解决问题的思路。虽然没有固定的定性规则,但可以根据自己的实践经验和理解,提出一些常见的优化思路和原则,比如减少对象的创建和销毁、合理配置内存参数、优化算法和数据结构等。
总之,在回答JVM调优相关的面试题时,除了记住一些常见的问题和解决方案,更重要的是展示出自己的思考和解决问题的能力。
我是努力的小雨,一名 Java 服务端码农,潜心研究着 AI 技术的奥秘。我热爱技术交流与分享,对开源社区充满热情。同时也是一位掘金优秀作者、腾讯云内容共创官、阿里云专家博主、华为云云享专家。
💡 我将不吝分享我在技术道路上的个人探索与经验,希望能为你的学习与成长带来一些启发与帮助。
🌟 欢迎关注努力的小雨!🌟
相关文章:
JVM调优篇:探索Java性能优化的必备种子面试题
JVM内存模型 首先面试官会询问你在进行JVM调优之前,是否了解JVM内存模型的基础知识。这是一个重要的入门问题。JVM内存模型主要包括程序计数器、堆、本地方法栈、Java栈和方法区(1.7之后更改为元空间,并直接使用系统内存)。 正常…...
常见的内存泄漏及其解决方案
内存泄漏是Java开发中一个常见且令人头疼的问题,即使在使用垃圾回收机制的Java中,也无法完全避免内存泄漏的出现。当对象不再需要时却仍然占据着内存,导致内存使用量不断增加,最终可能导致 OutOfMemoryError。本文将深入探讨Java中…...
SQLSERVER 触发器记录表某个字段更新记录
想要记录该字段的原值和现有值,触发器写法: CREATE TRIGGER tr_UpdateEmployeeDepartment ON Employees AFTER UPDATE AS BEGINSET NOCOUNT ON; -- 避免多余的计数消息IF UPDATE(Department) -- 检查是否更新了 Department 字段BEGININSERT INTO Update…...
现代前端架构介绍(第一部分):App是如何由不同的构建块构成的
远离JavaScript疲劳和框架大战,了解真正重要的东西 几周前,我的同事们对我们的前端架构、代码结构和面临的挑战很感兴趣。在做了几次关于如何构建可扩展且健壮的前端的演讲后,我觉得把它们都总结一下并与社区分享我们的策略是一个不错的主意。…...
Android 11 关于按键拦截/按键事件处理分享
系统在frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java处理按键事件,不管是物理按键还是 SystemUI的nav_bar上的虚拟按键(使用了KeyEvent类中的,比如:KeyEvent.KEYCODE_VOLUME_UP). 主要注意的有两个函数: interceptKeyBef…...
最新TomatoIDC开源虚拟主机销售系统源码/有插件系统模块+模版系统
源码简介: 最新TomatoIDC开源虚拟主机销售系统源码,它有一个方便扩展的插件和模版系统模块,使用实用。 TomatoIDC,一款遵循GPL3.0协议的开源虚拟主机销售系统,不仅有着可以轻松扩展的插件系统和模版系统,…...
简单的docker学习 第4章docker容器
第4章 Docker容器 4.1 容器基础 4.1.1 容器启动流程 通过 docker run 命令可以启动运行一个容器。该命令在执行时首先会在本地查找指定的镜像,如果找到了,则直接启动,否则会到镜像中心查找。如果镜像中心存在该镜像,则会下载到…...
PHP中如何声明数组
数组是一种数据结构,用于存储一系列的值或对象,这些值或对象可以通过索引(或键)来访问。在PHP中,数组是一种复合类型的数据结构,可以存储多个值,这些值可以是整型、字符串、布尔值,甚…...
JavaScript前端面试题——fetch
什么是fetch? fetch:fetch是浏览器内置的api,用于发送网络请求 ajax&axios&fetch的关系 ajax:ajax 是一种基于原生 JavaScript 的异步请求技术。它使用 XMLHttpRequest 对象来发送请求和接收响应。 axios:…...
在Qt中获取Windows中进程的PID
主要是用到了系统自带的工具【tasklist.exe】 利用 QProcess调用这个tasklist有一点坑,已经在代码中指出了。 指定为csv格式输出的话,在后处理时比较方便。 QList<quint64> listProcessIdentifier(QString processName) {QProcess process;QStrin…...
8.1-java+tomcat环境的配置+代理
一、回顾 1.安装nodejs,这是一个jdk一样的软件运行环境 yum -y list installed|grep epel yum -y install nodejs node -v 2.下载对应的nodejs软件npm yum -y install npm npm -v npm set config .....淘宝镜像 3.安装vue/cli command line interface 命令行…...
gorm框架实现基本的增删改查
连接数据库 package mainimport ("github.com/jinzhu/gorm"_ "github.com/jinzhu/gorm/dialects/mysql" )func main() {db, err : gorm.Open("mysql","root:roottcp(127.0.0.1:3306)/test?charsetutf8mb4&parseTimeTrue&locLocal…...
AUTOSAR介绍
1、AUTOSAR架构介绍 AUTOSAR(AUTomotive Open System ARchitecture,汽车开放系统架构)是汽车和软件行业领先公司的全球合作联盟,为智能移动开发和建立标准化的软件框架以及开放的E/E系统架构。考虑到目前和未来市场中不同的汽车E/E架构,AUTOS…...
10. 计算机网络HTTP协议
1. 前言 无论是作为后端开发、前端开发、测试开发程序员或者是运维人员,在面试过程中,大概率都会被问到 HTTP 协议相关题目。 因为伴随着 2010 年之后移动互联网在全世界的高速发展,各种各样的浏览器(Chrome、FireFox、Safari 等)层出不穷,也诞生了诸多服务端开发的语言…...
“职场中,不要和上司作对”,真的很重要吗?你认同这句话吗?
在职场上,领导对下属的期望永远都只有两个字,不是忠诚,也不是能力,而是省心。 领导对下属的要求就是别让我操心。 在职场中,通常面临的首要问题就是如何与领导相处。 把职场中的前辈当作老师来尊重,你尊…...
可视化目标检测算法推理部署(一)Gradio的UI设计
引言 在先前RT-DETR模型的学习过程中,博主自己使用Flask框架搭建了一个用于模型推理的小案例: FlaskRT-DETR模型推理 在这个过程中,博主需要学习Flask、HTML等相关内容,并且博主做出的页面还很丑,那么,是…...
【PyTorch】基于YOLO的多目标检测项目(一)
【PyTorch】基于YOLO的多目标检测项目(一) 【PyTorch】基于YOLO的多目标检测项目(二) 目标检测是对图像中的现有目标进行定位和分类的过程。识别的对象在图像中显示有边界框。一般的目标检测方法有两种:基于区域提议的…...
spring boot 实现 Stream 钉钉事件订阅
1: 参考链接 https://open.dingtalk.com/document/orgapp/develop-stream-mode-push-server 2:钉钉开放平台订阅配置 配置之后运行一下上面提供的链接 里面的main方法,验证通道 3:订阅启动方式 EventListenerThread eventListenerThrea…...
基于 Rough.js 的 Vue 散点图绘制
本文由ScriptEcho平台提供技术支持 项目地址:传送门 基于 Rough.js 的 Vue 散点图绘制 应用场景 本代码展示了如何使用 Rough.js 库在 Vue 应用程序中绘制散点图。Rough.js 是一个轻量级 JavaScript 库,用于创建具有手绘风格的可视化效果。散点图是一…...
【c++】用c++指针传递来模拟“靶向治疗”
一:源码: #include <iostream>void targetedTherapy(bool* flag) {if (*flag == false) {*flag = true;} }int main() {//代表一系列癌细胞//true为健康细胞 false为癌变细胞bool cancerCell[7] = {true, false, true, true, true, true, false};for (int i = 0; i &…...
如何开启idea中的断言功能?
目录 一、什么是断言? 二、Java断言的语法 三、开启断言 一、什么是断言? 断言(assert)是 Java 中的一条语句,一种在程序中的逻辑(如一个结果为真或假的逻辑判断式),目的是验证软…...
大模型之语言大模型技术
本文作为大模型综述第二篇,介绍语言大模型基本技术。 近年来,在 Transformer 架构基础上构建的预训练语言模型为自然语言处理领域带来了一系列突破式进展,成为人工智能主流技术范式。预训练语言模型采用“预训练+微调”方法,主要分为两步: 1)将模型在大规模无标注数据上…...
浮点数例外 (核心已转储) 的问题记录
一般这种问题,是程序运行过程中出现浮点数运算错误导致的程序崩溃 浮点异常可能由以下几个原因引起: 除以零:当程序中出现除以零的操作时,会触发浮点异常。例如,当一个数除以0时,会导致浮点异常。数值溢出…...
Vite项目中根据不同打包命令配置不同的后端接口地址,proxy解决跨域
在vite.config.ts同级目录添加两个文件 .env.development #开发环境 VITE_APP_ENV developmentVITE_APP_BASE_API .env.production #生产配置 VITE_APP_ENV productionVITE_APP_BASE_API https://www.bdjw.work代码中使用路径 const request axios.create({baseURL: i…...
Java新手启航:JDK 21 版本安装,开启编程之行
在Java开发前,JDK是必不可少的环境,接下来,让我们一起完成JDK 21版本的下载和安装! 种一棵树最好的时间是10年前,其次就是现在,加油! …...
Redis学习[5] ——Redis过期删除和内存淘汰
六、Redis过期键值删除 6.1 Redis的过期键值删除策略 6.1.1 什么是过期键值删除? Redis中是可以对key设置过期时间的,所以需要有相应的机制将已过期的键值对删除,也就是**过期键值删除策略。Redis会用一个过期字典(expires dic…...
书生大模型学习笔记 - Python
Python实现wordcount 请实现一个wordcount函数,统计英文字符串中每个单词出现的次数。返回一个字典,key为单词,value为对应单词出现的次数。 解题思路:首先把字母转小写>然后把单词取出来去除标点>循环单词列表>key已存…...
JavaScript青少年简明教程:面向对象编程入门
JavaScript青少年简明教程:面向对象编程入门 JavaScript 支持多种编程范式(programming paradigms),即支持多种不同的编程风格和方法。 前面介绍的编程方式,主要是面向过程编程(Procedural Programming&am…...
电话号的标准
点击标题下「蓝色微信名」可快速关注 最近碰到个电话号码的问题,除了常规数字,可能还会有国内国际的区号,例如中国,86、086、86,这些好像都见过,但什么是标准的?谁来定义的? 国际电信…...
做动态网站的素材怎么收集/百度集团股份有限公司
align"absmiddle"//图标绝对居中方式line-height: 25px; //行高vertical-align:middle// 图片文字垂直居中a:link,定义正常链接的样式;a:visited,定义已访问过链接的样式;a:hover,定义鼠标悬浮在链接上时的样…...
平面设计素材网站排名/旺道seo工具
清代的著名制墨家曹素功,但是关于他到底叫什么?一直没有一个具体的定论,学者尹润生《漫谈满文墨》文称:“曹素功,名圣臣,字昌言,号荩庵”。而《尹润生墨苑鉴藏录》(尹润生著、尹雨立整理)&#…...
百度建设网站的目的/网络营销教案ppt
rvm 全称Ruby Version Manager, 确实是一个非常好用的ruby版本管理以及安装工具.下面介绍一下rvm的安装, 使用rvm, 安装ruby, 以及gem的使用.一、安装rvm官方网站上介绍得很简单, 但是使用官方网站安装会出现问题, SSL的问题. 所以我分两步进行, 第一步下载安装脚本. 第二步修…...
做民宿怎么登录网站/深圳英文站seo
dubbo深入浅出—923人已学习 课程介绍 Dubbo是阿里巴巴SOA服务化治理方案的核心框架,每天为2,000个服务提供3,000,000,000次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点。课程收益学会dubbo的使用和理解dubbo的代码实现和底层原理讲师介绍熊文…...
腾讯云服务器网站域名备案/爱站网长尾关键词搜索
网络层的主要任务是实现网络互连,进而实现数据包在各网络之间的传输。 🎍网络层提供的两种服务 面向连接的虚电路服务: 可靠通信由网络来保证必须建立网络层的连接——虚电路VC(Virtual Circuit)通信双方沿着已建立的虚电路发送分组目的主机的地址仅在连接建立阶段使用,之…...
wordpress去掉链接中的m/山东seo推广公司
原文 Oracle查看和修改其最大的游标数 以下的文章主要是介绍Oracle查看和修改其最大的游标数,本文主要是通过相关代码的方式来引出Oracle查看和修改其最大的游标数的实际操作步骤,以下就是文章的具体内容的描述,望你在浏览完之后,…...