Daihui Gu

Results 60 issues of Daihui Gu

### 开启远程调试: 在java启动参数中开启 jdwp (Java Debug Write Proc),如下两种方式均可 ``` java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=: java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=: ``` 其中,transport=dt_socket 表示使用 socket 的方式连接调试,在 Windows 下还可以使用共享内存的方式。 ### 远端调试: 使用最基本的调试命令 jdb (Java Debug ),如下命令: ``` jdb...

## 如何确定某个对象是“垃圾”? ### 引用计数法: 如果一个对象没有任何引用与之关联,则说明该对象基本不太可能在其他地方被使用。这种算法简单高效,但是它无法解决循环引用的问题。 ### 可达性分析法: 通过一系列的“GC Roots”对象作为起点进行搜索,如果在“GC Roots”和一个对象之间没有可达路径,则称该对象是不可达的,不过要注意的是被判定为不可达的对象不一定就会成为可回收对象。被判定为不可达的对象要成为可回收对象必须至少经历两次标记过程,如果在这两次标记过程中仍然没有逃脱成为可回收对象的可能性,则基本上就真的成为可回收对象了。 ### 比较常见的可回收对象: 1. 显示地将某个引用赋值为null或者将已经指向某个对象的引用指向新的对象 2. 局部引用所指向的对象 3. 只有弱引用与其关联的对象 ## 垃圾收集算法 1. Mark-Sweep(标记-清除)算法 2. Copying(复制)算法 3. Mark-Compact(标记-整理)算法 4. Generational Collection(分代收集)算法 目前大部分垃圾收集器对于新生代都采取Copying算法,因为新生代中每次垃圾回收都要回收大部分对象,也就是说需要复制的操作次数较少,但是实际中并不是按照1:1的比例来划分新生代的空间的,一般来说是将新生代划分为一块较大的Eden空间和两块较小的Survivor空间,每次使用Eden空间和其中的一块Survivor空间,当进行回收时,将Eden和Survivor中还存活的对象复制到另一块Survivor空间中,然后清理掉Eden和刚才使用过的Survivor空间。...

## 重排序 大多数现代微处理器都会采用将指令乱序执行(out-of-order execution,简称OoOE或OOE)的方法,在条件允许的情况下,直接运行当前有能力立即执行的后续指令,避开获取下一条指令所需数据时造成的等待3。通过乱序执行的技术,处理器可以大大提高执行效率。 除了处理器,常见的Java运行时环境的JIT编译器也会做指令重排序操作,即生成的机器指令与字节码指令顺序不一致。 ## as-if-serial语义 As-if-serial语义的意思是,所有的动作都可以为了优化而被重排序,但是必须保证它们重排序后的结果和程序代码本身的应有结果是一致的。Java编译器、运行时和处理器都会保证**单线程**下的as-if-serial语义。 为保证as-if-serial语义,Java异常处理机制也会为重排序做一些特殊处理。比如 try 内的代码被重排序后,会加入到 catch 中。这种做法将异常捕捉的逻辑变得复杂了,但是JIT的优化的原则是,尽力优化正常运行下的代码逻辑,哪怕以catch块逻辑变得复杂为代价,毕竟,进入catch块内是一种“异常”情况的表现。 ## happens-before规则 根据Java内存模型中的规定,可以总结出以下几条happens-before规则8。Happens-before的前后两个操作不会被重排序且后者对前者的内存可见。 - 程序次序法则:线程中的每个动作A都happens-before于该线程中的每一个动作B,其中,在程序中,所有的动作B都能出现在A之后。 - 监视器锁法则:对一个监视器锁的解锁 happens-before于每一个后续对同一监视器锁的加锁。 - volatile变量法则:对volatile域的写入操作happens-before于每一个后续对同一个域的读写操作。 - 线程启动法则:在一个线程里,对Thread.start的调用会happens-before于每个启动线程的动作。 - 线程终结法则:线程中的任何动作都happens-before于其他线程检测到这个线程已经终结、或者从Thread.join调用中成功返回,或Thread.isAlive返回false。 - 中断法则:一个线程调用另一个线程的interrupt happens-before于被中断的线程发现中断。...

BTrace 可以对正在运行的 Java 程序,通过修改 bytecode 字节码,来跟踪程序的运行,对于排查线上问题,非常有用。 #### BTrace 介绍 BTrace is a safe, dynamic tracing tool for Java. BTrace works by dynamically (bytecode) instrumenting classes of a running Java program....

以下UT问题也困扰了好久,不知道什么原因,用 Eclipse 插件跑 PowerMock + TestNG 都没问题,但是用 mvn 命令就出现以下问题: ``` Running TestSuite org.apache.maven.surefire.util.SurefireReflectionException: java.lang.reflect.InvocationTargetException; nested exception is java.lang.reflect.InvocationTargetException: null java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at...

下面的问题搞了我两天,有时候一个小问题找不到原因,就会心烦意乱的,再此记录一下,如有遇到,可以少走弯路。 ### 错误一 #### 错误堆栈 ``` java.lang.RuntimeException: java.lang.ExceptionInInitializerError at org.testng.internal.MethodInvocationHelper.invokeDataProvider(MethodInvocationHelper.java:161) at org.testng.internal.Parameters.handleParameters(Parameters.java:429) at org.testng.internal.Invoker.handleParameters(Invoker.java:1383) ........ at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:204) at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:175) Caused by: java.lang.ExceptionInInitializerError at org.mockito.internal.exceptions.stacktrace.ConditionalStackTraceFilter.(ConditionalStackTraceFilter.java:17) at org.mockito.exceptions.base.MockitoException.filterStackTrace(MockitoException.java:30) ........ at java.lang.reflect.Method.invoke(Unknown Source)...

pxc = percona xtradb cluster MySQL-mmm

有的时候用root权限也无法查看,这时候可以用tomcat权限查看数据: ``` sudo -u tomcat ./java//bin/jstack -J-d64 $pid > stack.log ``` 注意:得到的堆栈信息,其中的线程ID是16进制的,而top -H 的线程ID是10进制的,需要转换一下。

看一下,以下代码会输出什么? ``` public static void main(String[] args) { boolean t1 = true; boolean t2 = true; boolean f1 = false; boolean f2 = false; // 前面是|| System.out.println(t1 || f1 &&...

JSL(The Java® Language Specification) JAVA语言规范中建议的关键字顺序 1. public 2. protected 3. private 4. abstract 5. static 6. final 7. transient 8. volatile 9. synchronized 10. native 11. strictfp 可以看出,static 在 final...