1 activemq设计模式
观察者设计模式
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String args[]){
Boss huhan=new Boss();
StockObserver stockObserver=new StockObserver("wyf",huhan);
huhan.attach(stockObserver);
huhan.setState("我回来了");
huhan.notify1();
}
}
interface Subject{
void attach(Observer observer);
void detach(Observer observer);
void notify1();
String getState();
void setState(String state);
}
class Boss implements Subject{
private List<Observer> observers=new ArrayList<>();
private String action;
public void attach(Observer observer){
observers.add(observer);
}
public void detach(Observer observer){
observers.remove(observer);
}
public void notify1(){
for (Observer b:observers)
b.update();
}
public String getState(){
return action;
}
public void setState(String state){
action=state;
}
}
abstract class Observer{
protected String name;
protected Subject sub;
public Observer(String name, Subject sub) {
this.name = name;
this.sub = sub;
}
public abstract void update();
}
class StockObserver extends Observer{
public StockObserver(String name, Subject sub) {
super(name, sub);
}
@Override
public void update() {
System.out.println(sub.getState()+name+"关闭股票行情,继续工作");
}
}
2 arraylist删除偶数个位置的值
public static List doL(List l){
for(int i=l.size()-1; i>=0; i--){
if(i%2 == 0)
l.remove(i);
}
return l;
}
3 jvm调优 oom
一、java堆溢出 堆的最小值:-Xms 堆的最大值:-Xmx
如果是内存泄漏,通过工具查看泄漏对象到GC Roots的引用链,找到泄漏对象是通过怎样的路径与GC Roots相关联并导致垃圾收集器无法自动回收它们。然后可以定位到泄漏代码的位置。
如果是内存溢出,检查虚拟机的堆参数与机器物理内存对比看是否还可以调大。从代码上检查是否存在某些对象生命周期过长,尝试减少程序运行时的内存消耗。
二、虚拟机栈和本地方法栈溢出
-Xss:线程堆栈大小,单线程情况下,栈深度过大或者定义了大量的本地变量,都只会产生StackOverFlowError
创建足够多的多线程会产生OutOfMemoryError,不过原因不是因为超出栈容量,而是超出内存容量
三、方法区和运行时常量池溢出
jdk 1.6运行时常量池在方法区中,可以通过设置方法区大小,使用intern方法使方法区溢出。
jdk 1.7中intern方法可以在运行时常量池存储对象和对象引用,并且运行时常量池在java堆中。
cglib字节码增强技术可以动态加载类,方法区可能溢出
四、直接内存溢出
-XX:MaxDirectMemorySize设置直接内存,可以通过DirectByteBuffer和反射获取Unsafe实例进行内存分配,使直接内存溢出。
NIO可能会造成这种情况。
4 索引类型
index,unique,primary key,fulltext
5 线程运行的方式
实现Thread重写run方法,start线程。
实现Runnable重写run方法,Thread构造runnable。
实现Callable重写call方法,FutrueTask构造,Thread运行,FutrueTask实例get返回结果。call方法可以有返回值可以声明抛出异常。
ThreadPoolExecutor可以execute Runnable,submit Runnable和Callable。