pull/6/head
yuanguangxin 4 years ago
parent 7e69818e7d
commit f8429463fc

@ -3,6 +3,7 @@
<component name="ChangeListManager">
<list default="true" id="af7ffdf2-4ddc-4ed6-8222-60ed5acbc2ed" name="Default Changelist" comment="">
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Rocket.md" beforeDir="false" afterPath="$PROJECT_DIR$/Rocket.md" afterDir="false" />
</list>
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
@ -261,14 +262,8 @@
<workItem from="1588302756697" duration="3701000" />
<workItem from="1588749661816" duration="451000" />
<workItem from="1589857792404" duration="221000" />
<workItem from="1591254276718" duration="1552000" />
</task>
<task id="LOCAL-00018" summary="update q10/q746">
<created>1581705212871</created>
<option name="number" value="00018" />
<option name="presentableId" value="LOCAL-00018" />
<option name="project" value="LOCAL" />
<updated>1581705212871</updated>
<workItem from="1591254276718" duration="1779000" />
<workItem from="1591328701703" duration="290000" />
</task>
<task id="LOCAL-00019" summary="update q10">
<created>1581705262462</created>
@ -606,7 +601,14 @@
<option name="project" value="LOCAL" />
<updated>1591262493149</updated>
</task>
<option name="localTasksCounter" value="67" />
<task id="LOCAL-00067" summary="update">
<created>1591266199793</created>
<option name="number" value="00067" />
<option name="presentableId" value="LOCAL-00067" />
<option name="project" value="LOCAL" />
<updated>1591266199793</updated>
</task>
<option name="localTasksCounter" value="68" />
<servers />
</component>
<component name="TypeScriptGeneratedFilesManager">
@ -691,11 +693,11 @@
<screen x="0" y="0" width="1440" height="900" />
</state>
<state x="458" y="204" key="#com.intellij.refactoring.safeDelete.UnsafeUsagesDialog/0.0.1440.900@0.0.1440.900" timestamp="1587221348872" />
<state x="404" y="60" key="CommitChangelistDialog2" timestamp="1591262493032">
<state x="404" y="60" key="CommitChangelistDialog2" timestamp="1591266199658">
<screen x="0" y="0" width="1920" height="1080" />
</state>
<state x="303" y="50" key="CommitChangelistDialog2/0.0.1440.900@0.0.1440.900" timestamp="1588749779133" />
<state x="404" y="60" key="CommitChangelistDialog2/0.0.1920.1080@0.0.1920.1080" timestamp="1591262493032" />
<state x="404" y="60" key="CommitChangelistDialog2/0.0.1920.1080@0.0.1920.1080" timestamp="1591266199658" />
<state x="191" y="94" width="1152" height="720" key="DiffContextDialog" timestamp="1591262490778">
<screen x="0" y="0" width="1920" height="1080" />
</state>
@ -747,11 +749,11 @@
<screen x="0" y="0" width="1440" height="900" />
</state>
<state x="221" y="63" key="SettingsEditor/0.0.1440.900@0.0.1440.900" timestamp="1585223890241" />
<state x="427" y="228" key="Vcs.Push.Dialog.v2" timestamp="1591262494365">
<state x="427" y="228" key="Vcs.Push.Dialog.v2" timestamp="1591266200846">
<screen x="0" y="0" width="1920" height="1080" />
</state>
<state x="320" y="190" key="Vcs.Push.Dialog.v2/0.0.1440.900@0.0.1440.900" timestamp="1588749781144" />
<state x="427" y="228" key="Vcs.Push.Dialog.v2/0.0.1920.1080@0.0.1920.1080" timestamp="1591262494365" />
<state x="427" y="228" key="Vcs.Push.Dialog.v2/0.0.1920.1080@0.0.1920.1080" timestamp="1591266200846" />
<state x="100" y="100" width="1240" height="700" key="com.intellij.history.integration.ui.views.FileHistoryDialog" timestamp="1587219014962">
<screen x="0" y="23" width="1440" height="797" />
</state>

@ -437,11 +437,11 @@ JVM引入动态年龄计算主要基于如下两点考虑
4. 外部命令导致系统缓慢
一个数字校园应用系统发现请求响应时间比较慢通过操作系统的mpstat工具发现CPU使用率很高并且系统占用绝大多数的CPU资 源的程序并不是应用系统本身。每个用户请求的处理都需要执行一个外部shell脚本来获得系统的一些信息执行这个shell脚本是通过Java的 Runtime.getRuntime().exec()方法来调用的。这种调用方式可以达到目的但是它在Java 虚拟机中是非常消耗资源的操作,即使外部命令本身能很快执行完毕,频繁调用时创建进程 的开销也非常可观。Java虚拟机执行这个命令的过程是:首先克隆一个和当前虚拟机拥有一 样环境变量的进程,再用这个新的进程去执行外部命令,最后再退出这个进程。如果频繁执 行这个操作系统的消耗会很大不仅是CPU内存负担也很重。用户根据建议去掉这个Shell脚本执行的语句改为使用Java的API去获取这些信息后 系统很快恢复了正常。
一个数字校园应用系统发现请求响应时间比较慢通过操作系统的mpstat工具发现CPU使用率很高并且系统占用绝大多数的CPU资 源的程序并不是应用系统本身。每个用户请求的处理都需要执行一个外部shell脚本来获得系统的一些信息执行这个shell脚本是通过Java的 Runtime.getRuntime().exec()方法来调用的。这种调用方式可以达到目的但是它在Java 虚拟机中是非常消耗资源的操作,即使外部命令本身能很快执行完毕,频繁调用时创建进程 的开销也非常可观。Java虚拟机执行这个命令的过程是:首先克隆一个和当前虚拟机拥有一样环境变量的进程再用这个新的进程去执行外部命令最后再退出这个进程。如果频繁执行这个操作系统的消耗会很大不仅是CPU内存负担也很重。用户根据建议去掉这个Shell脚本执行的语句改为使用Java的API去获取这些信息后系统很快恢复了正常。
5. 由Windows虚拟内存导致的长时间停顿
一个带心跳检测功能的GUI桌面程序每15秒会发送一次心跳检测信号如果 对方30秒以内都没有信号返回那就认为和对方程序的连接已经断开。程序上线后发现心跳 检测有误报的概率,查询日志发现误报的原因是程序会偶尔出现间隔约一分钟左右的时间完 全无日志输出,处于停顿状态。
一个带心跳检测功能的GUI桌面程序每15秒会发送一次心跳检测信号如果对方30秒以内都没有信号返回那就认为和对方程序的连接已经断开。程序上线后发现心跳 检测有误报的概率,查询日志发现误报的原因是程序会偶尔出现间隔约一分钟左右的时间完 全无日志输出,处于停顿状态。
因为是桌面程序,所需的内存并不大(-Xmx256m)所以开始并没有想到是GC导致的 程序停顿,但是加入参数-XX:+PrintGCApplicationStoppedTime-XX:+PrintGCDateStamps- Xloggc:gclog.log后从GC日志文件中确认了停顿确实是由GC导致的大部分GC时间都控 制在100毫秒以内但偶尔就会出现一次接近1分钟的GC。
@ -600,9 +600,14 @@ Spring使用了三级缓存解决了循环依赖的问题。在populateBean()给
2. CGlib动态代理利用ASM开源的Java字节码编辑库操作字节码开源包将代理对象类的class文件加载进来通过修改其字节码生成子类来处理。
3. 区别JDK代理只能对实现接口的类生成代理CGlib是针对类实现代理对指定的类生成一个子类并覆盖其中的方法这种通过继承类的实现方式不能代理final修饰的类。
### @Transactional 在private上会生效么
### @Transactional错误使用失效场景
@Transactional注解只能应用在public方法上。当标记在protected、private、package-visible方法上时不会产生错误但也不会表现出为它指定的事务配置。可以认为它作为一个普通的方法参与到一个public方法的事务中。
1. @Transactional 在private上当标记在protected、private、package-visible方法上时不会产生错误但也不会表现出为它指定的事务配置。可以认为它作为一个普通的方法参与到一个public方法的事务中。
2. @Transactional 的事务传播方式配置错误。
3. @Transactional 注解属性 rollbackFor 设置错误Spring默认抛出了未检查unchecked异常继承自 RuntimeException 的异常)或者 Error才回滚事务其他异常不会触发回滚事务。
4. 同一个类中方法调用,导致@Transactional失效由于使用Spring AOP代理造成的因为只有当事务方法被当前类以外的代码调用时才会由Spring生成的代理对象来管理。
5. 异常被 catch 捕获导致@Transactional失效。
6. 数据库引擎不支持事务。
### Spring的的事务传播机制

Loading…
Cancel
Save