jar启动脚本

nohup java -noverify -server -Xmx1024M -Xms1024M -Xmn512M  -XX:SurvivorRatio=2 -Xss256k  -XX:+ExplicitGCInvokesConcurrent -XX:+UseCMSInitiatingOccupancyOnly -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=0 -XX:+CMSClassUnloadingEnabled -XX:LargePageSizeInBytes=128M -XX:+UseFastAccessorMethods -XX:CMSInitiatingOccupancyFraction=70 -XX:SoftRefLRUPolicyMSPerMB=0 -XX:+PrintClassHistogram -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintHeapAtGC -Xloggc:logs/gc.log  -XX:+HeapDumpOnOutOfMemoryError  -Dcom.sun.management.jmxremote  -Dcom.sun.management.jmxremote.port=26696 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=192.168.103.25  -jar *.jar --spring.profiles.active=prod >logs/server.log 2>&1 & tail -f logs/server.log

java虚拟机asm底层代码分析

java代码运行在虚拟机,虚拟机是如何运行java代码的?

首先虚拟机把数据和方法地址入栈,然后再出栈放置到局部变量。

数据和方法进入的栈,叫做操作数栈,是用来把指令和数据送入至cpu,来运行代码的堆栈。

cpu先把数据存入操作数栈中,然后在出栈,放入到局部变量表中。局部变量表暂存局部变量的内存池。

java虚拟机运行的是class文件,查看class文件指令,可以通过idea的view->show bytecode可以查看。记住一定要选中java文件,才行。

下面一个实例说明java class指令如何运行

java 虚拟机指令

另一个java自定义异常

有时候为了简化业务判断,可以抛出自定义异常,然后在最顶层,根据异常信息返回不用的信息。

定义系统异常基类:

public class BusinessException extends Exception {
private static String baseMsg = "business exception:";
public BusinessException(String msg) {
super(baseMsg+msg);
}
}

子类1:

public class OpenIdIsEmptyException  extends BusinessException {
private static String msg = "openId is empty";
public OpenIdIsEmptyException() {
super(msg);
}
}

子类2:

public class UserIsNotExistException extends BusinessException {
private static String msg = "user is not exist";
public UserIsNotExistException() {
super(msg);
}
}

底层抛出

}else{
logger.info("userName:{} is not exist",userName);
throw new UserIsNotExistException();
}

方法抛出

throws OpenIdIsEmptyException, UserIsNotExistException 

顶层捕获

} catch (UserIsNotExistException e) {
e.printStackTrace();
logger.info("UserIsNotExistException"+e.getMessage());
return new ResponseEntity<>(e.getMessage(), HttpStatus.BAD_REQUEST);
}