当前位置:德化新闻中心 > 媒体聚焦 >

运城java编程开发异常问题与内存模型分析
时间:2019-11-02  来源:  作者:admin666

随着互联网的不断发展,java编程开发的使用范围也越来越广泛,这就导致了许多????ж???????????????人在入门软件开发的时候都会去学习java编程语言,而今天我们就给大家分享一些java异常与内存的一些技术知识,下面我们就一起来了解一下具体情况吧。

运城java编程开发异常问题与内存模型分析

1、异常

Java的异常(包括Exception和Error)分为:

可查的异常(checkedexceptions)

除了RuntimeException及其子类以外,其他的Exception类及其子类都属于可查异常。这种异常的特点是Java编译器会检查它,也就是说,当程序中可能出现这类异常,要么用try-catch语句捕获它,要么用throws子句声明抛出它,否则编译不会通过。

不可查的异常(uncheckedexceptions)

包括运行时异常(RuntimeException与其子类)和错误(Error)。

运行时异常和非运行时异常:

RuntimeException

NullPointerException(空指针异常)、IndexOutOfBoundsException(下标越界异常)等这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。运行时异常的特点是Java编译器不会检查它,也就是说,当程序中可能出现这类异常,即使没有用try-catch语句捕获它,也没有用throws子句声明抛出它,也会编译通过。

RuntimeException以外的Exception

从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。如IOException、SQLException等以及用户自定义的Exception异常,一般情况下不自定义检查异常。

2、内存模型

Java内存模型规定,对于多个线程共享的变量,存储在主内存当中,每个线程都有自己独立的工作内存,线程只能访问自己的工作内存,不可以访问其它线程的工作内存。工作内存中保存了主内存共享变量的副本,线程要操作这些共享变量,只能通过操作工作内存中的副本来实现,操作完毕之后再同步回到主内存当中。

如何保证多个线程操作主内存的数据完整性是一个难题,Java内存模型也规定了工作内存与主内存之间交互的协议,先是定义了8种原子操作:

lock:将主内存中的变量锁定,为一个线程所独占

unclock:将lock加的锁定解除,此时其它的线程可以有机会访问此变量

read:将主内存中的变量值读到工作内存当中

load:将read读取的值保存到工作内存中的变量副本中。

use:将值传递给线程的代码执行引擎

assign:将执行引擎处理返回的值重新赋值给变量副本

store:将变量副本的值存储到主内存中。

write:将store存储的值写入到主内存的共享变量当中。

3、内存组成

堆(Heap)

运行时数据区域,所有类实例和数组的内存均从此处分配。Java虚拟机启动时创建。对象的堆内存由称为垃圾回收器的自动内存管理系统回收。

NewsGeneration(YoungGeneration即图中的Eden+FromSpace+ToSpace)

Eden存放新生的对象

SurvivorSpace两个存放每次垃圾回收后存活的对象

OldGeneration(TenuredGeneration即图中的OldSpace)主要存放应用程序中生命周期长的存活对象

非堆内存

JVM具有一个由所有线程共享的方法区。方法区属于非堆内存。它存储每个类结构,如运行时常数池、字段和方法数据,以及方法和构造方法的代码。它是在Java虚拟机启动时创建的。除了方法区外,Java虚拟机实现可能需要用于内部处理或优化的内存,这种内存也是非堆内存。例如,JIT编译器需要内存来存储从Java虚拟机代码转换而来的本机代码,从而获得高性能。

【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。




上一篇:运城linux编程开发通知链表运行原理与结构类型
下一篇:没有了

图片新闻
热闻排行
友情链接

Copyright (C) 2016 德化新闻中心 版权所有,未经授权禁止复制或镜像,本站保留所有权利
蜀icp备14010686号-1