现在是随手记。后面会详细整理。。。
当某个线程抛出OutOfMemoryError时,其他线程有可能不受影响
try块中如果有System.exit(0);代码就会不执行finally块代码
不管是堆内存溢出,或者栈内存溢出,其余线程都会继续工作
无法强制垃圾回收器立即执行
system.gc可以提醒垃圾回收执行,不能强制
sleep是线程类(Thread)的方法,wait是Object类的方法;
sleep不释放对象锁,wait放弃对象锁;
sleep暂停线程、但监控状态仍然保持,结束后会自动恢复;
wait后进入等待锁定池,只有针对此对象发出notify方法后获得对象锁进入就绪状态。
java基本数据类型
内置类型
boolen 1
byte 8
short char 16
int float 32
long double 64
引用类型
C++基本的内置类型
C++ 为程序员提供了种类丰富的内置数据类型和用户自定义的数据类型。下表列出了七种基本的 C++ 数据类型:
类型
关键字
布尔型
bool
字符型
char
整型
int
浮点型
float
双浮点型
double
无类型
void
宽字符型
wchar_t
JVM中使用类加载器的优先级是:根类加载器(bootstrap class loader)扩展类加载器(extensions class loader)系统类加载器(system class loader)用户类加载器(user class loader)
相同点:两者都是用来实现对某个资源的同步。
两者区别如下:
(1) 用法不一样。synchronized可以用于修饰方法,也可以用在代码块中。Lock需要指定起始和终点位置,一般放在try-finally结构中,try开始执行lock方法,finally中执行unlock方法。synchronized是托管给JVM执行的,Lock是通过代码执行的。
(2) 性能不一样。在资源竞争不激烈情况下,synchronized的性能比Lock好,而在资源竞争激烈时,synchronized的性能下降很快,而Lock基本保持不变。
锁机制不一样。synchronized获得锁和释放锁都是在块结构中,获取多个锁时必须以相反顺序释放,并且自动释放锁。Lock需要开发人员手动释放锁,并且放在finally中。
方法的重写(Overriding)和重载(Overloading)是java多态性的不同表现,重写是父类与子类之间多态性的一种表现,重载可以理解成多态的具体表现形式。
(1)方法重载是一个类中定义了多个方法名相同,而他们的参数的数量不同或数量相同而类型和次序不同,则称为方法的重载(Overloading)。
(2)方法重写是在子类存在方法与父类的方法的名字相同,而且参数的个数与类型一样,返回值也一样的方法,就称为重写(Overriding)。
(3)方法重载是一个类的多态性表现,而方法重写是子类与父类的一种多态性表现。
JAVa NIO是同步非阻塞,通过选择器Selector监听多个通道(Channel),响应其感兴趣的事件(每个通道在选择器上注册的事件).(Reactor模式)
标准的IO基于字节流和字符流进行操作的,而NIO是基于通道(Channel)和缓冲区(Buffer)进行操作
Java NIO可以让你异步的使用IO,例如:当线程从通道读取数据到缓冲区时,线程还是可以进行其他事情
Java NIO引入了选择器的概念,选择器用于监听多个通道的事件
1.数据库的事务交给JDBC的Connection去处理.
connection.autoCommit(false); //相当于在数据库端开启事务 start transaction;
connection.setTransactioIsolation(isolation); //设置隔离级别;
connection.commit(); //提交事务
connection.rollback(savePoint);//回滚
2.JTA是指Java Transaction API,JTA允许应用程序执行分布式事务处理.
分布式事务(distributed transaction)包括一个事务管理器(transaction manager)和一个或多个资源管理器(resource manager).
在并发编程有个名称叫线程安全,怎么理解一个类是线程安全
1.安全性是指不会有意外的事情发生.
2.一个类是线程安全的指的是该类的域不会因为并发修改而出现一致性问题.
JSP和Servlet有哪些相同点和不同点,它们的联系是什么?
相同点:
它们本质上都是java类
不同点:
1、JSP经编译后变成Servlet
2、jsp更擅长表现于页面显示,Servlet更擅长于逻辑控制
3、Servlet的应用逻辑是在java文件中,并且完全从表现层中的HTML里分离开来。而JSP的情况是Java和HTML可以组合成一个扩展名为.jsp的文件。
联系:
JSP是Servlet技术的扩展,本质上是Servlet的简易方式。
java导致内存泄露的原因很明确:长生命周期的对象持有短生命周期对象的引用就很可能发生内存泄露,尽管短生命周期对象已经不再需要,但是因为长生命周期对象持有它的引用而导致不能被回收,这就是java中内存泄露的发生场景。
1.集合类,集合类仅仅有添加元素的方法,而没有相应的删除机制,导致内存被占用。这一点其实也不明确,这个集合类如果仅仅是局部变量,根本不会造成内存泄露,在方法栈退出后就没有引用了会被jvm正常回收。而如果这个集合类是全局性的变量(比如类中的静态属性,全局性的map等即有静态引用或final一直指向它),那么没有相应的删除机制,很可能导致集合所占用的内存只增不减,因此提供这样的删除机制或者定期清除策略非常必要。
2.单例模式。不正确使用单例模式是引起内存泄露的一个常见问题,单例对象在被初始化后将在JVM的整个生命周期中存在(以静态变量的方式),如果单例对象持有外部对象的引用,那么这个外部对象将不能被jvm正常回收,导致内存泄露
性能选项
通常情况下,不推荐使用Vector以及其子类Stack
1.需要线程同步
使用Collections工具类中synchronizedXxx()将线程不同步的ArrayDeque以及LinkedList转换成线程同步。
2.频繁的插入、删除操作:LinkedList
3.频繁的随机访问操作:ArrayDeque
4.未知的初始数据量:LinkedList
————————————————