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

linux下设置tomcat自启动

vi /etc/init.d/tomcat


#!/bin/sh
# chkconfig: 345 99 10
# description: Auto-starts tomcat
# /etc/init.d/tomcat
# Tomcat auto-start
# Source function library.
#. /etc/init.d/functions
# source networking configuration.
#. /etc/sysconfig/network
RETVAL=0
export JRE_HOME=/home/jdk/jdk/jre
export CATALINA_HOME=/home/tomcat/tomcat
export CATALINA_BASE=/home/tomcat/tomcat
start()
{
        if [ -f $CATALINA_HOME/bin/startup.sh ];
          then
            echo $"Starting Tomcat"
                $CATALINA_HOME/bin/startup.sh
            RETVAL=$?
            echo " OK"
            return $RETVAL
        fi
}
stop()
{
        if [ -f $CATALINA_HOME/bin/shutdown.sh ];
          then
            echo $"Stopping Tomcat"
                $CATALINA_HOME/bin/shutdown.sh
            RETVAL=$?
            sleep 1
            ps -fwwu tomcat | grep apache-tomcat|grep -v grep | grep -v PID | awk '{print $2}'|xargs kill -9
            echo " OK"
            # [ $RETVAL -eq 0 ] && rm -f /var/lock/...
            return $RETVAL
        fi
}

case "$1" in
 start)
        start
        ;;
 stop)
        stop
        ;;

 restart)
         echo $"Restaring Tomcat"
         $0 stop
         sleep 1
         $0 start
         ;;
 *)
        echo $"Usage: $0 {start|stop|restart}"
        exit 1
        ;;
esac
exit $RETVAL

然后sudo chmod +x /etc/init.d/tomcat

chkconfig –add tomcat

chkconfig tomcat on

serice tomcat start

java虚拟机asm底层代码分析

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

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

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

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

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

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

java 虚拟机指令

如何避免消息重复消费,消息幂等性

消息幂等性,就是同一个消息多次消费,同一次消费效果一样。解决办法有多种

1是给消息一个唯一编码,每次消费后,记录一下。再次消费时,比对一下是否消费过,如果消费过,就不消费。

2.把消息编码放到redis的set里,因为set是不可重复的,只需要从set中比对,如果存在,则表示已经消费过,不再重复消费。

cdi上下文依赖注入

cdi是web容器调用对象的方式,通过依赖注入的方式解耦容器与java对象, 为了解决EJB、javabean被web层组件引用困难的问题 。

cdi是j2ee规范,spring,jboss seam,ejb都实现了cdi规范。所以spring的依赖注入是遵从j2ee的cdi规范的。

所以了解java规范协议是很有益的,让你知道为什么厂商支持这种技术,为了什么目的采用这种技术等等问题。