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规范协议是很有益的,让你知道为什么厂商支持这种技术,为了什么目的采用这种技术等等问题。

logback开发测试环境日志文件位置定制

logback日志文件生成位置需要指定绝对路径,这块不能指定项目相对路径,但是开发环境和测试环境路径又不一致。所以使用springProfile来制定开发还是测试路径。

<springProfile name="prod">
<appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>/home/xxx/software/xxx/logs/server.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>/home/xxx/software/xxx/logs/%d{yyyy-MM,aux}/server-%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100M</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>-->
<maxHistory>10</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>

</appender>
</springProfile>
<springProfile name="test">
<appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>/home/xxx/software/test/xxx/logs/server.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>/home/xxx/software/test/xxx/logs/%d{yyyy-MM,aux}/server-%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100M</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>-->
<maxHistory>10</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>

</appender>
</springProfile>

领域驱动无分层

ddd的核心是领域模型,包括聚合根,领域服务,外围是应用服务,资源库。

应用服务和资源库是并列服务于领域的,资源库并不是最底层于数据库打交道的,而是与应用服务并列的。资源库强调的是对聚合根的集合的操作,是领域与数据库的隔离。隔离了领域与数据库的耦合。

领域驱动架构的架构是六边形架构,外围服务是可插拔的,服务于核心领域服务的。

领域驱动架构图:

《霸王别姬》首看,不错

这个电影早听说过,才看。是不是很out了。这部电影通过演唱霸王别姬的两位京剧演员,展示了近代京剧的历史,和京剧人的酸甜苦辣,充分展示了各个近代历史阶段,京剧人的人生经历,包括清末时期,民国时期,解放战争时期,建国初,文化大革命时期。让人看着,五味杂粮,感情很丰富,内容很深刻。

看过一遍,还会再看,因为内容太丰富了,总想了解细节。有个疑问,电影开头虞姬为什么比霸王要多说一年?

国荣的剧打算再追一追。老人的剧还是值得一看的。

时隔十几年又买回来dell latitude

进来新添笔记本计划,我思考了我的用本需求,高cpu,高内存,固态,用于软件开发。考虑来考虑去,还是dell商务本性价比最高。

最终买了dell latitude 5501, i7 9850h,32g内存,1t固态。原来考虑thinkpadp50,扩展性最好,但是考虑到32g内存的升级费用,还是算了吧。苹果本并不十分感冒,听说挺好,但是考虑到配置,特别是内存配置,还是不划算。最终才选择了这款,买就买吧,希望不要让我失望。