前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >理解Java8的数据类型和运行时数据区域

理解Java8的数据类型和运行时数据区域

作者头像
我是攻城师
发布2018-10-19 16:40:18
5410
发布2018-10-19 16:40:18
举报
文章被收录于专栏:我是攻城师我是攻城师

Java的数据类型

从广泛概念上区分,Java中仅仅存在两种数据类型:

基本类型:primitive

基本类型就是常见的byte,short,int,long等。

引用类型:reference

Java虚拟机包含对对象的显式支持,对象要么是动态分配的类实例,要么是静态数组,对对象的引用我们可以叫做指针或者引用,一个对象可以有多个引用,对象总是通过引用的值进行操作,传递和测试。

(1)基本类型和值

包括整数类型和浮点类型:

代码语言:javascript
复制
整数类型
1 byte= 8bit
byte  有符号(包括正负) 1字节 
short 有符号(包括正负) 2字节
int 有符号(包括正负)  4字节
long 有符号(包括正负) 8字节
char 无符号(仅仅正整数) 2字节

浮点类型:

float 有符号  (包括正负)4字节
double 有符号(包括正负) 8字节

布尔类型
boolean:(jvm底层是通过int实现)
true=1
false=0

(2) 引用类型和值

引用类型总共有3种,class类型,array类型,interface类型,他们的值分别是对动态创建的类实例,数组或者是实现interface的类实例或者数组。

数组类型的值必须是同一种类型,可以是基本类型,也可以是class类型,或者是interface类型。引用类型的值可以是null,代表当前没有引用对象,null引用没有任何运行时类型,但是它可以被强转为任何类型。引用类型默认的值为null。

运行时数据区域

java虚拟机定义了不同类型的运行时区域来使用,在程序执行期间,这些区域在JVM启动的时候创建,然后当JVM退出的时候销毁。其他的数据区域是在线程启动的时候创建,同样在线程退出时销毁。

(一)PC程序计数寄存器(线程私有)(program counter register)

Java语言支持多线程运行,每个虚拟机线程有自己的程序计数器,在任何时候,每个线程只能执行一个方法,换句话说就是当前正在执行的方法,如果方法非native方法,那么PC寄存器保存了当前线程执行指令的地(returnAddress),如果当前执行方法是native方法,在PC寄存器状态是未定义的。

(二)虚拟机栈Stack(线程私有)

每个线程都有自己的私有栈,在线程启动时候创建,在结束时候销毁,它保存了local变量和局部的结果数据,是方法调用和返回的一个媒介。栈的大小可以固定也可以动态改变,并且栈的内存不要求连续。

栈上可能发生的异常:

(1)如果线程的计算需要更大的栈,超过了设定的值,那么会抛出: StackOverflowError

(2)如果栈可以被动态的扩展,但是现在没有足够的内存用于扩展或者栈的内存已经不足于在创建一个新的线程,那么会抛出: OutOfMemoryError

(三)堆Heap(线程共享)

JVM里面的堆内存是被所有线程共享的,堆里面存的数据主要是所有的类实例和数组,堆在虚拟机启动时创建,严格的说这块内存属于JVM进程的,对象只能显式的创建,但是不能显式的销毁,这一点与C语言不同,Java自动管理内存回收是通过GC(garbage collector)来实现的,堆里面的内存是通过gc回收的,堆的内存也是不需要连续的,在gc时候会自动整理碎片,回收掉无用的对象。

堆的大小可以是固定的,也可以是动态扩展的,如果计算所需要的内存大于了当前分配的有效内存,那么会抛出: OutOfMemoryError

(四)方法区(包含在堆里面,线程共享)

方法区也是所有线程共享的区域,方法区主要用来存储编译后的代码,包括每个类的结构,运行时常量池,方法和字段数据及方法的代码和构造函数。包括用于类和实例及接口初始化的特定方法。

方法区在JVM启动时创建,方法区虽然包含在堆里面,但大部分情况下这个区域的内存是不需要进行GC回收和压缩的,同样方法区的大小可以固定也可以动态扩展,如果没有有效的内存,也会抛出常:OutOfMemoryError。

(五)运行时常量池(包含在方法区里面,线程共享)

用来存储每个类或者每个接口,编译或者运行时的常量值,如果内存不够,也会抛出异常: OutOfMemoryError。

(六)本地方法栈(Native Method Stacks线程私有)

这个栈大多数虚拟机实现的时候基本会和JVM虚拟机栈合并,所以有可能存在也有可能不存在,通常是用C语言编写的,用来支持Java的native方法,在内存不足时,会抛出异常StackOverflowError和OutOfMemoryError。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-09-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 我是攻城师 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Java的数据类型
  • 运行时数据区域
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档