JAVA异常、多线程、垃圾回收_第1页
JAVA异常、多线程、垃圾回收_第2页
JAVA异常、多线程、垃圾回收_第3页
JAVA异常、多线程、垃圾回收_第4页
JAVA异常、多线程、垃圾回收_第5页
已阅读5页,还剩53页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

异常、多线程、垃圾回收主讲人:翟佳宇CompanyLogo主要内容Java异常处理机制1多线程编程2垃圾回收机制3Java代码优化编程4CompanyLogo异常基本概念当出现程序无法控制的外部环境问题(用户提供的文件不存在,文件内容损坏,网络不可用等)时,Java就会用异常对象处理。异常的顶层父类:java.lang.Throwable参考实例:ShowException.javaCompanyLogo异常分类异常分类:检查性异常java.lang.Exception(编译异常)运行期异常

java.lang.RuntimeException错误:java.lang.ErrorCompanyLogo异常分类检查性异常:程序正确,但因为外在的环境条件不满足而引发。例如:用户错误及I/O问题---程序试图打开一个不存在的远程端口或者打开不存在的文件。Java编译器强制要求处理这类异常,如果不捕获这类异常,程序讲不能被编译。参考实例:略CompanyLogo异常分类运行异常程序存在bug如数组越界,0作为被除数,这类异常一般通过程序来避免,Java编译器强制要求处理这类异常编译器检测不到这类异常,不会完全排除参考实例:TypeCheckException.javaCompanyLogo异常分类错误:一般很少见,也很难通过程序解决。它可能源于程序的bug,更可能源于环境问题,如内存耗尽,程序中无需处理,而由运行环境处理。示例:这个没法演示CompanyLogo异常处理方法异常处理方法:处理异常在可能出现异常的地方直接处理异常抛出异常异常抛给函数调用者,让函数调用者去处理异常CompanyLogo异常处理方法(一)处理异常try{……}catch{……}finally{……}CompanyLogo异常处理方法(一)try{……}catch{……}在出现异常的地方终止执行代码,进入catch语句,如果有多个catch语句则进入匹配异常的catch块中CompanyLogo异常处理方法(一)finally{……}如果把finally块置于try…catch语句后,finally块一般都会得以执行,相当于一个保障,即使前面的try块发生异常而没有处理对应异常的catch块,finally会马上执行CompanyLogo异常处理方法(一)关于finally注意以下情况中,finally块将不会被完全执行:finally块中发生异常程序所在线程死亡在前面代码中用了System.exit();关闭CPUCompanyLogo异常处理方法(二)抛出异常将异常抛给函数调用者,让函数调用者去处理异常参考实例:ExceptionThrow.javaCompanyLogo主要内容Java异常处理机制1多线程编程2垃圾回收机制3Java代码优化编程4CompanyLogo多线程编程线程概念线程→进程进程:进程是指运行中的应用程序,每个进程都有自己独立的地址空间(内存空间)CompanyLogo进程←→线程计算机内存空间:进程三进程二(eclipse)进程一(eclipse)线程一线程二线程三……CompanyLogo进程←→线程CompanyLogo多线程线程的创建方法通过继承Thread类,并重写run函数实现Runnable接口并且重写run函数示例:创建一个线程对象,实现每隔一秒输出helloworld并且在执行指定次后结束CompanyLogo多线程为什么提供两种方法?因为Java是单继承的,在某些情况下一个类已经继承了某个父类,这是再用继承的方式来创建线程已经不可能了,这样就提出了另外一种方法来创建线程:通过Runnable接口来创建。CompanyLogo多线程两种方法的区别本质上没有区别。但是实现是有所区别:通过继承Thread类实现 Humanhu=newHuman(); //运行start函数后线程进入运行状态(Running) hu.start();通过实现Runnable接口实现 Human2hu=newHuman2(); ThreadT = newThread(hu); T.start();在编写程序时,尽量使用接口实现进程类CompanyLogo线程的状态关系创建Runnable(可执行状态)Running(运行状态)Blocked(阻塞状态)Dead(死亡状态)出生可以工作参加工作人生发生意外,失去了工作能力CompanyLogo多线程操作线程的方法线程的休眠Thread.sleep()线程的加入Thread.join()线程的中断Terrupt()线程的礼让Thread.yeild()CompanyLogo线程的操作方法(一)线程的休眠sleep(longmillis)Thread类的sleep方法用于让当前线程暂时休眠一段时间参数millis的单位是毫秒示例:略CompanyLogo线程的操作方法(二)线程的加入join()处在“执行状态”的线程如果调用了其他线程的join方法,将被挂起进入“阻塞状态”目标线程执行完毕后才会解除阻塞,回到“可执行状态”例如:A/B是两个线程,在线程A中调用线程B.join(),此时线程A将被阻塞,直到线程B执行完毕举例:com.bupt.MultiThread.JoinThreadTest.javaCompanyLogo线程的操作方法(三)线程的中断Interrupt()在线程受到阻塞时抛出一个中断信号,这样线程就得以退出阻塞的状态。更确切的说,如果线程被Object.wait,Thread.join和Thread.sleep三种方法之一阻塞,那么,它将接收到一个中断异常(InterruptedException),从而提早地终结被阻塞状态。Terrupt()方法不会中断一个正在运行的线程。举例:com.bupt.MultiThread.InterruptThreadTest.java

CompanyLogo线程的操作方法(四)线程的礼让yield()它只是给当前正处于运行状态下的线程一个提醒,告知它可以将资源让给其他线程,但这只是一种暗示,没有任何一种机制保证当前线程会将资源礼让。使具有相同优先级的线程有机会进入可执行的机会。对支持多任务的操作系统来说,不需要调用yield()方法,因为操作系统会为线程自动分配CPU时间来执行

CompanyLogo多线程线程同步的引出铁路卖票系统示例:SellTicketSys.java

CompanyLogo线程同步多线程应用程序同时访问共享对象时,由于线程间相互抢占CPU的控制权,造成一个线程夹在另一个线程的执行过程中运行,所以可能导致错误的执行结果。

CompanyLogo对象锁线程同步为了防止共享对象在并发访问时出现错误,Java中提供了“synchronized”关键字。synchronized关键字确保共享对象在同一时刻只能被一个线程访问,这种处理机制称为“线程同步”或“线程互斥”。Java中的“线程同步”基于“对象锁”的概念CompanyLogo对象锁Java对象锁示例:CompanyLogo同步方法使用synchronized关键字同步方法被“synchronized”关键字修饰的方法称为“同步方法”当一个线程访问对象的同步方法时,被访问对象就处于“锁定”状态,访问该方法的其他线程只能等待

CompanyLogo同步块使用synchronized关键字同步块如果只希望同步部分代码行,可以使用“同步块”

同步块的作用与同步方法一样,只是控制范围有所区别

在多线程应用程序中,obj代表被锁定的共享对象CompanyLogo线程同步正确的售票系统示例:SynchronousSellTicketSys.java

CompanyLogo多线程线程间的通信线程之间的通信使用wait()、notify()、notifyAll()方法实现

CompanyLogo多线程同步wait()调用wait()函数可以让一个线程等待某个条件发生变化,但是这个变化不是当前线程能够控制的。Wait()会在外部等待世界产生变化的时候把任务挂起,并且只有在notify()、notifyAll()发生时才会被唤醒并且去检查所产生的变化。Sleep方法调用是不释放锁,但是wait方法会释放锁,让其他需求该锁方法执行notify()、notifyAll()从wait状态中唤醒线程

CompanyLogo多线程注意只能在同步方法或者同步块中调用wait()、notify()、notifyAll(),如果在非同步块或者同步方法中调用这些方法,程序能通过编译,但是运行的时候会得到java.lang.IllegalMonitorStateException异常。这个异常的原因就是当前线程没有获得对象的锁,或者说,当前调用的对象不是锁对象。调用wait(),notify(),notifyAll()的对象必须是当前锁对象。常见的毛病就是使用了线程对象来调用这些方法CompanyLogo主要内容Java异常处理机制1多线程编程2垃圾回收机制3Java代码优化编程4CompanyLogo垃圾回收机制概念GC(GarbageCollection)垃圾回收是Java程序设计中内存管理的核心概念,JVM的内存管理机制被称为垃圾回收机制。一个对象创建后被放置在JVM的堆内存中,当永远不再引用这个对象时,它将被JVM在堆内存中回收。被创建的对象不能再生,同时也没有办法通过程序语句释放它们。

CompanyLogo垃圾回收机制

classnode{ intvalue; nodenext;}…nodep,q;p=newnode();q=newnode();q=p;CompanyLogo垃圾回收机制GC的基本原理对于程序员来说,分配对象使用new关键字;释放对象时,只要将对象所有引用赋值为null,让程序不能够再访问到这个对象,我们称该对象为"不可达的".GC将负责回收所有"不可达"对象的内存空间。GC通过确定对象是否被活动对象引用来确定是否收集该对象。GC首先要判断该对象是否是时候可以收集。两种常用的方法引用计数对象引用遍历

CompanyLogoGC常用收集器(一)引用计数收集器原理:引用计数是垃圾收集器中的早期策略。在这种方法中,堆中每个对象(不是引用)都有一个引用计数。当一个对象被创建时,且将该对象分配给一个变量,该变量计数设置为1。当任何其它变量被赋值为这个对象的引用时,计数加1(a=b,则b引用的对象+1),但当一个对象的某个引用超过了生命周期或者被设置为一个新值时,对象的引用计数减1。任何引用计数为0的对象可以被当作垃圾收集。当一个对象被垃圾收集时,它引用的任何对象计数减1。

CompanyLogoGC常用收集器(一)引用计数收集器优缺点优点:引用计数收集器可以很快的执行,交织在程序运行中。对程序不被长时间打断的实时环境比较有利。缺点:引用计数器增加了程序执行的开销,因为每次对象赋给新的变量,计数器加1,而每次现有对象出了作用域生,计数器减1。CompanyLogoGC常用收集器(二)标记-清除收集器原理:这种收集器首先遍历对象图并标记可到达的对象,然后扫描堆栈以寻找未标记对象并释放它们的内存。这种收集器一般使用单线程工作并停止其他操作。并且,由于它只是清除了那些未标记的对象,而并没有对标记对象进行压缩,导致会产生大量内存碎片,从而浪费内存。注意:只有当堆满的时候,才开始标记-清除过程。首先,遍历跟踪运行时栈指向的所有引用,把他们指向的内存设为标记。然后检测堆块中没有标记的块,释放这些内存。

CompanyLogoGC常用收集器(二)标记-清除收集器优缺点优点:也许永远不需要运行跟踪收集器,因为只有在heap满的时候才运行。跟踪收集器可以发现并释放所有不可用的内存缺点:GC需要停止其他的活动。这种方法意味着所有与应用程序相关的工作停止,只有GC运行。在运行期间这种不可预期的中断也许是某些应用不能接受的。

CompanyLogoGC常用收集器(三)复制收集器原理:这种收集器将堆栈分为两个域,常称为半空间。每次仅使用一半的空间,JVM生成的新对象则放在另一半空间中。GC运行时,它把可到达对象复制到另一半空间,从而压缩了堆栈。这种方法适用于短生存期的对象,持续复制长生存期的对象则导致效率降低。并且对于指定大小堆来说,需要两倍大小的内存,因为任何时候都只使用其中的一半。

CompanyLogoGC常用收集器(三)复制收集器优缺点优点:相比于标记-清除收集器,复制收集器较快。缺点:只能使用一半的堆空间。

CompanyLogo总结垃圾收集器的作用Java语言规范没有明确地说明JVM使用哪种垃圾回收算法,但是任何一种垃圾回收算法一般要做2件基本的事情:发现无用信息对象回收被无用对象占用的内存空间,使该空间可被程序再次使用其他垃圾收集器

CompanyLogo主要内容Java异常处理机制1多线程编程2垃圾回收机制3Java代码优化编程4CompanyLogoJava优化编程尽量复用对象例如String对象的使用中,出现字符串连接情况时应用StringBuffer代替。示例:

Stringa=“hello”;Stringb=“world”;a=a+b;helloworldhelloworldabCompanyLogoJava优化编程换作StringBuffer

StringBuffera=“hello”;StringBufferb=“world”;a=a+b;helloworldabhelloworldJava优化编程由于JVM的有其自身的GC机制,不需要程序开发者的过多考虑,从一定程度上减轻了开发者负担,但同时也遗漏了隐患,过分的创建对象会消耗系统的大量内存,严重时会导致内存泄露,因此,保证过期对象的及时回收具有重要意义。JVM回收垃圾的条件是:对象不在被引用;然而,JVM的GC并非十分的机智,即使对象满足了垃圾回收的条件也不一定会被立即回收。所以,建议我们在对象使用完毕,应手动置成null。Java优化编程尽量减少对变量的重复计算

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论