一:finnally中抛出异常情况
1: java中的异常程序图
所有的异常都是集成Throwable接口,异常有主要分为两大类,一个是Error,一个是Exception,
Error主要是错误,平常余件比较多的就是StackOverFlowError和OutOfMemoryError,一般遇到这种错误,虚拟机就会线则停止线程。
Exception是程序允许的异常,主要分为运行时异常和非运行时异常
非运行时异常就是在I/O操作,数据库操作的时候,如果我们不处理,编译器就不会允许编译通过的异常比如FileNotFoundException
运行时异常就是我们平常处理的,比如经常有的数组越界,类转换错误,数字类型的错误等等,这些是我们可以从程序逻辑上规避的
2:处理异常
一般我们处理异常的时候基本都是抛出或者捕获
抛出异常:直接throws出去,本身不处理,直接抛到方法之外
捕获异常:通过try-catch-finnally机制进行异常的捕获处理,程序本身作处理
try:用于捕获异常,后面一般跟着一个或者多个catch快,如果没有,那么要有finnally操作
catch:一般用来捕获try中抛出的异常
finnally:无论方法是否捕获异常,finnally语句都会被执行,在try和catch中有return的时候,finnally会在方法返回之前被执行,但是一下情况,finnally并不会执行
1:finnally块中如果发生了异常
2:在try或者catch中调用了System.exit()方法(JVM过早被终止了)
3:当前线程已经结束
4:CPU被关闭
当发finally中有return的时候,会覆盖catch和try中的值,所以finnally中慎用return
当finally和catch中存在throw 异常的时候,finally会覆盖catch中的异常,最后以finally为主
二:操作系统的一级缓存二级缓存
现在买电脑的时候经常会发现什么三级缓存
加入缓存的原因就是CPU的计算速度和磁盘I/O速度极度不匹配,一般都是加入了二级缓存,还有的比较高级的加入了三级缓存,
存储器一般分为静态RAM,和动态RAM,操作系统缓存的实现就是利用SRAM来实现,因为他不需要刷新,直接可以存储数据,而且速度比动态RAM快,我们内存一般使用的DRAM。
操作系统的缓存类似我们数据库前面加入的缓存,都是把最近访问频率多的数据放在缓存中,没有的话就会去内存中查找,然后找到了,在拷贝到缓存中,命中率一般百分之八十左右,
一级缓存:
Intel和AMD的实现不同,AMD的一级缓存设置的比较大,但是Intel的一级缓存设置的比较小,他认为如果缓存太大,还会浪费寻址时间
二级缓存:
相反的是,Intel的二级缓存比较大,AMD的二级缓存比较小
三级缓存:
一般来说三级缓存都是分为层级的,每一级缓存中存储的数据都是下一层的一部分,三级缓存的容量也是逐级递增的,相应的成本和工艺也是递减的,CPU读取数据的时候会先从一级缓存中读取,如果没有在去查找二级缓存,二级缓存没有在去查找三级缓存,实在没有才会去查找内存中的,一般来说每级的命中率都在80%左右,也就是说,所有数据的80%都可以在一级缓存中找到,剩下的20%也可以在二级缓存,三级缓存和内存中找到,所以一级缓存是很重要的。
那么data load 到Cache中,还会有一个问题,就是何时去淘汰无用的数据,一般来用的LRU算法,包括现在NoSql数据库redis也是采用这种算法,最少使用的去淘汰。
三:JVM设计规则,如何设计JVM
根据Java SE7规范规定了以下核心组建:
java虚拟机特点如下:
1:基于栈存储结果,Intel和AMD是基于寄存器架构的,JVM是基于栈的
2:符号引用,除了基本数据类型因外的数据(类和接口)的引用,都是采用了符号引用,而不是显式的使用内存地址调用
3:垃圾回收机制,类的实例都是用户来创建,但是垃圾回收是通过垃圾回收机制进行回首
4:通过基本类型的清晰定义来保证平台无关性,在c和c++中,int的大小取决于平台,但是在java中,int就是4个字节,于平台无关,至于jvm有关
5:网络字节码顺序,java class文件是采用网络字节码进行存储,为了保证与小端的Intel x86架构和大端的RISC架构无关性,java采用的大端序(端序是指内存中数据存放顺序,一个字节的号说,如果是多个字节,小端序就是低字节存储在低位,高位字节存储高位,大端序正好相反)
四:Object o = new Object();用到了jvm那些
1:首先去检查jvm常量池中找到该类的符号引用,如果没有的话
2:如果jvm常量池中没有该类的符号引用,首先Object o 映射到jvm中就是一个一个reference类型的引用,存储在本地变量表中(Java虚拟机栈中)
3:new Object()创建的对象存在堆上
4:关于类的描述(对象类型,父类,实现的接口,方法等)存储在方法区
当访问这个对象的时候由来嗯中,reference执行一个句柄,句柄执行了对象的实例,这样的好处就是当移动对象的时候,只需要改变句柄的值就ok
第二种就是reference直接指向对象,这样的好处就是减少了寻址时间,Sun的HotSpot虚拟机就是采用了这种寻址方式