垃圾回收
- 垃圾回收在jvm中优先级相当相当低。
- 垃圾收集器(GC)程序开发者只能推荐JVM进行回收,但何时回收,回收哪些,程序员不能控制。
- 垃圾回收机制只是回收不再使用的JVM内存,如果程序有严重BUG,照样内存溢出。
- 进入DEAD的线程,它还可以恢复,GC不会回收
- 真正宣布一个对象死亡,至少需要经历2次标记过程。当第一次标记时会同时进行一次筛选(判断此对象是否有必要执行finalize方法)。如果对象没有覆盖该方法,就面临死亡,所以说这个方法是对象逃脱死亡命运的最后一次机会
桥接模式
桥接模式:
定义 :将抽象部分与它的实现部分分离,使它们都可以独立地变化。
意图 :将抽象与实现解耦。
桥接模式所涉及的角色
- Abstraction :定义抽象接口,拥有一个Implementor类型的对象引用
- RefinedAbstraction :扩展Abstraction中的接口定义
- Implementor :是具体实现的接口,Implementor和RefinedAbstraction接口并不一定完全一致,实际上这两个接口可以完全不一样Implementor提供具体操作方法,而Abstraction提供更高层次的调用
- ConcreteImplementor :实现Implementor接口,给出具体实现
Jdk中的桥接模式:JDBC
JDBC连接 数据库 的时候,在各个数据库之间进行切换,基本不需要动太多的代码,甚至丝毫不动,原因就是JDBC提供了统一接口,每个数据库提供各自的实现,用一个叫做数据库驱动的程序来桥接就行了
异常
线程
- 线程的启动方式只能通过start这种启动实现多线程的效果,如果是手动调用run方法和普通方法调用没有区别
构造函数私有
Java允许构造函数的私有化,被private修饰的构造函数无法在其他类中调用,也就是该类无法在其他类中实例化。
单例模式
public class Singleton {
private static Singleton instance;
private Singleton() {
// .......//
}
public Singleton getInstance() {
if (instance == null)
instance = new Singleton();
return instance;
}
}
- 类的内部包括一个类的实力,并且为static类型
- 构造函数为私有
- 通过提供一个获取实例的方法,比如getInstance,该方法也为static类型。
调用方式
Singleton instance = Singleton.getInstance();
堆外内存off-heap
- 堆外内存意味着把内存对象分配在Java虚拟机的堆以外的内存,这些内存直接受操作系统管理(而不是虚拟机)
- 将你的对象从堆中脱离出来序列化,然后存储在一大块内存中,这就像它存储到磁盘上一样,但它仍然在RAM中。对象在这种状态下不能直接使用,它们必须首先反序列化,也不受垃圾收集。序列化和反序列化将会影响部分性能(所以可以考虑使用FST-serialization)使用堆外内存能够降低GC导致的暂停。堆外内存不受垃圾收集器管理,也不属于老年代,新生代。
Collection & Map
Java常用工具
1、jps:查看本机java进程信息。
2、jstack:打印线程的栈信息,制作线程dump文件。
3、jmap:打印内存映射,制作堆dump文件
4、jstat:性能监控工具
5、jhat:内存分析工具
6、jconsole:简易的可视化控制台
7、jvisualvm:功能强大的控制台
零散点
- 中间件并不能提高内核的效率,一般只是负责网络信息的分发处理
- &&是逻辑与 即判断&&两侧的表达式是否都为真,都为真则此&&表达式值为真;& 是按位与 即将&两侧的数用二进制展开,每一位都求与运算,最后得到的二进制数即为结果;逻辑与结果只讲真和假,而按位与得出的却是实实在在的一个数
ACID
- 原子性:事务是一组不可分割的操作单元,这组单元要么同时成功要么同时失败(由DBMS的事务管理子系统来实现);
- 一致性:事务前后的数据完整性要保持一致(由DBMS的完整性子系统执行测试任务);
- 隔离性:多个用户的事务之间不要相互影响,要相互隔离(由DBMS的并发控制子系统实现);
- 持久性:一个事务一旦提交,那么它对数据库产生的影响就是永久的不可逆的,如果后面再回滚或者出异常,都不会影响已提交的事务(由DBMS的恢复管理子系统实现的)
Java创建对象
Java有5种方式来创建对象:
- 使用 new 关键字(最常用)
ObjectName obj = new ObjectName();
- 使用反射的Class类的newInstance()方法
ObjectName obj = ObjectName.class.newInstance();
- 使用反射的Constructor类的newInstance()方法
ObjectName obj = ObjectName.class.getConstructor.newInstance();
- 使用对象克隆clone()方法: ObjectName obj = obj.clone();
- 使用反序列化(ObjectInputStream)的readObject()方法
try(
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(FILE_NAME)));
{
ObjectName obj = ois.readObject();
}
释放锁
1.sleep会使当前线程睡眠指定时间,不释放锁
2.yield会使当前线程重回到可执行状态,等待cpu的调度,不释放锁
3.wait会使当前线程回到线程池中等待,释放锁,当被其他线程使用notify,notifyAll唤醒时进入可执行状态
4.当前线程调用 某线程.join()时会使当前线程等待某线程执行完毕再结束,底层调用了wait,释放锁
面向对象
多态 [可重用性],继承[可扩展性] ,封装[易于管理维护]