23-Spring_JVM-3

本文探讨了软件测试的重要性,包括性能测试、死锁检测和内存管理,并介绍了字节码技术及其应用,如cglib、AOP和热部署原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.测试

在这里先通篇讲一下,一般情况下,自己写的后台项目,是肯定要用工具进行测试的,之前有讲过Jmeter可以查看qps等信息

还有别的工具,可以测死锁,内存占用情况,线程情况等:

           Jconsole:JDK自带的坚持软件,UI有点丑,这里就可以检测出死锁情况

           Visual VM:也是Java自带的检测软件,UI比Jconsole好看很多,这里垃圾回收情况,然后这里也有个dump线程报告

一般情况下,客户端卡是因为IO阻塞,后台这里可以搞什么限流熔断等

2.字节码技术介绍

之前android的打码文件.这里也是都是.java文件,但是编译以后的java代码都是.class文件,需要用java反编译工具,进行反编译,这样就可以看到.java代码了.

例子:之前在spring看到过有类似@config这种

在这里有一个小例子,在使用lombok框架以后

在类的上方,写到了@Getter & @Setter ,这个就是自动会给全局变量,生成get和set方法,这里使用到的就是字节码技术

同样,cglib也是使用的字节码技术,还有AOP(暂时只知道这个叫做面向切面编程)

3.具体的字节码技术

javassist和ASM都属于字节码技术

cglib就是基于ASM,javassist性能比ASM略差,但是使用比ASM简单

而javassist的性能是高于反射

javaassist的缺点:不支持一些extends,以及continue,break的表达式

4.demo

这里在讲到字节码技术的时候,用到了很多陌生的api,用api来创建.class文件,然后讲到了热部署原理,其本质上就是动态来修改.class文件,其实就是一种IO操作

之前spring书里面的讲什么"依赖注入"阿...把简单的东西讲复杂不算本事,反倒这种行为很弟弟

5.类加载器

jvm在运行代码的时候,是把.class文件加载到jvm内存中,而且这种加载行为,只会加载一次,如果你在第一次加载了以后,中途修改了.class文件,那么依然不会起到作用,所以,在实际项目中,就算修改了.class文件,也是需要重启,除非用热部署

6.题外话,几个小知识

之后肯定是要学maven的...之后再学

静态代码块是在构造方法之前创建的,静态代码块的调用与全局变量的调用顺序,是按照从上到下

Object obj = new Object(),在这里,new出来的对象,自然是放在堆内存,但是其引用obj是放在栈中的

7.热部署 & 自定义类加载器

热部署,就是我挂在服务器的代码,可以随时进行修改,而不用重启,但是这样很好性能

一般情况下,都是不会使用热部署的

在这里,热部署,就是自己写一个类加载器,然后把之前的.class文件覆盖掉,并且重新load到jvm中,原理很简单,api看起来有点长,不过这不算啥...

8.分布式配置中心

一般情况下,代码尽量不要变...而是要修改配置....

总结:

考虑到自己工作,之前后台经常出现很多bug,在后台项目写完了以后,测试,无论是性能,死锁,CPU占用率,措施,防攻击,这些测试都是要做的,这些都是很基本的东西........Jmeter测吞吐量,Visual vm测内存情况,打印日志,看程序是否稳定,无差错...没有测试就直接上的,真的不行,纯属弟弟行为...

<think>我们正在编写一个BAT脚本来启动JAR包,并传递指定的系统参数(以-D开头的参数)。这些参数是JVM参数,通常在java命令后面直接传递。步骤:1.确定java可执行文件的路径。如果系统中已经配置了JAVA_HOME环境变量,我们可以使用它;否则,我们可以直接使用"java",但这样需要确保java在PATH中。2.编写启动命令:java[系统参数]-jarjar包路径3.将用户提供的系统参数(-D开头的参数)放在-jar之前。注意:BAT脚本中,如果路径包含空格,需要使用双引号括起来。根据用户需求,需要传递的参数有:-DNACOS_NAMESPACE=8cba1e0a-f8e2-4979-a182-9bdbc05e1af2-DNACOS_SERVER_ADDR=10.251.22.122-DNACOS_SERVER_GROUP=GROUP_DEV-DAPPLICATION_NAME=smics-gateway我们假设JAR包的路径是当前目录下的某个jar文件,例如gateway.jar(实际脚本中可能需要根据实际情况修改)。脚本示例:```bat@echooffrem设置JAVA_HOME,如果已经配置了环境变量则不需要,但这里我们优先使用JAVA_HOMEsetJAVA_HOME="C:\ProgramFiles\Java\jdk1.8.0_291"rem如果已经配置了JAVA_HOME环境变量,则不需要上面这行,可以直接使用%JAVA_HOME%rem如果不想设置JAVA_HOME,也可以直接使用java命令(确保在PATH中)setJAVA_EXE=%JAVA_HOME%\bin\java.exeifexist%JAVA_EXE%(setJAVA_CMD=%JAVA_EXE%)else(setJAVA_CMD=java)rem设置要传递的JVM参数setJVM_OPTS=-DNACOS_NAMESPACE=8cba1e0a-f8e2-4979-a182-9bdbc05e1af2-DNACOS_SERVER_ADDR=10.251.22.122-DNACOS_SERVER_GROUP=GROUP_DEV-DAPPLICATION_NAME=smics-gatewayrem设置JAR包的路径,这里假设jar包在当前目录下,名为gateway.jarsetJAR_PATH=gateway.jarrem启动Java应用程序%JAVA_CMD%%JVM_OPTS%-jar%JAR_PATH%pause```但是,如果用户希望更灵活地指定JAR包名称,或者参数有空格等情况,我们需要注意引号的使用。另外,上面的脚本中,如果JAVA_HOME没有设置,我们回退到使用java命令(要求java在PATH中)。如果用户已经设置了全局的JAVA_HOME环境变量,那么我们可以直接使用%JAVA_HOME%而不需要在脚本中写死。所以,更好的做法是:方案1:不设置JAVA_HOME,直接使用java命令(要求PATH配置正确)。方案2:在脚本中检查是否配置了JAVA_HOME环境变量,如果没有,尝试使用java命令。改进版本:```bat@echooffrem尝试使用JAVA_HOME环境变量ifdefinedJAVA_HOME(set"JAVA_EXE=%JAVA_HOME%\bin\java.exe")else(rem如果JAVA_HOME未定义,则检查java命令是否在PATH中setJAVA_EXE=java)rem设置JVM参数setJVM_OPTS=-DNACOS_NAMESPACE=8cba1e0a-f8e2-4979-a182-9bdbc05e1af2-DNACOS_SERVER_ADDR=10.251.22.122-DNACOS_SERVER_GROUP=GROUP_DEV-DAPPLICATION_NAME=smics-gatewayrem设置JAR文件路径(这里使用当前目录下的gateway.jar,可以根据需要修改)setJAR_FILE=gateway.jarrem检查jar文件是否存在ifnotexist"%JAR_FILE%"(echoError:JARfile&#39;%JAR_FILE%&#39;notfound.pauseexit/b1)rem执行命令"%JAVA_EXE%"%JVM_OPTS%-jar"%JAR_FILE%"rem保持窗口,以便查看输出(如果不需要,可以去掉pause)pause```注意:上面的脚本中,如果JAVA_EXE被设置为java,那么命令执行时会直接使用java,因为它在PATH中。如果java.exe不在PATH中,则可能会报错。另外,如果参数值包含空格,那么必须用引号括起来。例如:-Dsome.arg="valuewithspace"。但用户提供的参数中似乎没有空格,所以可以不用。但是,为了通用性,我们可以考虑将每个参数都加上引号,但这样并不正确,因为JVM参数中的空格是特殊处理的。通常,每个-D参数都是一个整体,如果参数值有空格,则整个-D表达式(即从-D开始到下一个空格之前)会被当作一个参数。所以,当参数值有空格时,我们需要用双引号将整个值括起来,例如:-Dparam="argwithspace"由于用户提供的参数中没有空格,所以我们可以按照上面的方式书写。如果用户需要启动的jar包不在当前目录,那么可以设置绝对路径或相对路径,例如:setJAR_FILE=..\lib\gateway.jar最后,如果启动后希望关闭窗口(不暂停),可以移除最后的pause命令。因此,最终脚本可以如下(根据实际调整):</think> ### 如何在 Windows 编写 BAT 脚本启动 JAR 包并传递系统参数 以下是完整的 BAT 脚本解决方案,支持传递指定的系统参数(`-D` 参数)并启动 JAR 包: ```batch @echo off setlocal enabledelayedexpansion :: ======== 可修改的配置部分 ======== :: 1. 设置JVM参数(根据实际需求修改) set JVM_OPTS=-DNACOS_NAMESPACE=8cba1e0a-f8e2-4979-a182-9bdbc05e1af2 ^ -DNACOS_SERVER_ADDR=10.251.22.122 ^ -DNACOS_SERVER_GROUP=GROUP_DEV ^ -DAPPLICATION_NAME=smics-gateway :: 2. 设置JAR文件路径(替换为您的实际路径) set JAR_PATH=your_application.jar :: 3. 设置Java安装路径(可选,如果配置了环境变量可删除) :: set JAVA_HOME="C:\Program Files\Java\jdk-17.0.1" :: ======== 执行启动命令 ======== :: 检查Java环境 if defined JAVA_HOME ( set "JAVA_EXE=%JAVA_HOME%\bin\java.exe" ) else ( set "JAVA_EXE=java" ) :: 启动应用 echo 正在启动应用,参数:%JVM_OPTS% "%JAVA_EXE%" %JVM_OPTS% -jar "%JAR_PATH%" :: 保留窗口查看输出 pause ``` ### 使用说明: 1. **修改配置** - 替换 `JAR_PATH` 为您的实际 JAR 文件路径 - 根据需要调整 `JVM_OPTS` 中的参数值 - 如果系统未配置 JAVA_HOME,取消注释 `set JAVA_HOME=...` 并填写实际路径 2. **保存脚本** - 将代码保存为 `.bat` 文件(如 `start_app.bat`) 3. **运行方式** - 双击运行或在 CMD 中执行脚本 - 窗口将保持打开状态显示程序输出 ### 关键参数说明: | 参数 | 说明 | 示例值 | |------|------|--------| | `-DNACOS_NAMESPACE` | Nacos 命名空间ID | `8cba1e0a-f8e2-4979-a182-9bdbc05e1af2` | | `-DNACOS_SERVER_ADDR` | Nacos 服务器地址 | `10.251.22.122` | | `-DNACOS_SERVER_GROUP` | Nacos 分组名称 | `GROUP_DEV` | | `-DAPPLICATION_NAME` | Spring 应用名称 | `smics-gateway` | > **注意**:参数中的 `^` 是 BAT 脚本的换行符,确保所有参数在同一个 set 命令中定义[^1] --- ### 相关问题 1. 如何在启动脚本中添加 JVM 内存参数(如 -Xmx)? 2. BAT 脚本如何后台运行 Java 程序? 3. 当需要传递动态参数时,如何修改脚本从命令行接收输入? 4. Windows 服务方式运行 Java 应用的配置方法? [^1]: BAT 脚本中 `set` 命令的特殊字符处理规范(Microsoft Docs)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值