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

Java的数据类型

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

基本类型:primitive

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

引用类型:reference

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

(1)基本类型和值

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

整数类型
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。

原文发布于微信公众号 - 我是攻城师(woshigcs)

原文发表时间:2018-09-18

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏程序员互动联盟

【答疑解惑第六讲】数组与指针区别在哪?

存在问题: 小伙伴都说指针和数组不好学,总是搞不太清楚?两者到底有啥区别? 解决方案: 很多初学者朋友总是对数组和指针模模糊糊,搞不清楚。对他们之间的联系与区...

354110
来自专栏IT可乐

Redis详解(四)------ redis的底层数据结构

  上一篇博客我们介绍了 redis的五大数据类型详细用法,但是在 Redis 中,这几种数据类型底层是由什么数据结构构造的呢?本篇博客我们就来详细介绍Redi...

16500
来自专栏向治洪

Promise机制详解

Javascript 采用回调函数(callback)来处理异步编程。从同步编程到异步回调编程有一个适应的过程,但是如果出现多层回调嵌套,也就是我们常说的厄运的...

36670
来自专栏用户2442861的专栏

C++ STL源码实现以及分析之vector

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/haluoluo211/article/d...

47710
来自专栏决胜机器学习

PHP数据结构(八) ——赫夫曼树实现字符串编解码(实践2)

PHP数据结构(八)——赫夫曼树实现字符串编解码(实践2) (原创内容,转载请注明来源,谢谢) 公众号规定不能超过3000字,只能分两篇,见谅。 由于需要分两篇...

35960
来自专栏逢魔安全实验室

UAF Writeup - pwnable.kr

0x00 UAF — pwnable.kr是一个韩国的CTF练习的网站,有很多经典的CTF题目供爱好者练习。 UAF(Use After Free)释放后重用...

38260
来自专栏iOS技术杂谈

Java8 Lambda表达式与Stream API (二): Stream API的使用你要知道的Java8 匿名内部类、函数式接口、lambda表达式与Stream API都在这里

你要知道的Java8 匿名内部类、函数式接口、lambda表达式与Stream API都在这里 转载请注明出处 https://cloud.tencent.co...

55060
来自专栏数据分析

char varchar nchar nvarcharar到底有多大区别

首先说明下,ASP.NET MVC系列还在龟速翻译中。 工作好多年,基础知识甚是薄弱,决定以后在coding(cv操作)的时候尽量多google下,然后总结下来...

32660
来自专栏企鹅号快讯

看完这篇文章我知道至少85%的人是没有入门Python的!花两周整理

以前刚学编程的时候就对Python略有耳闻,不过学校只有C,C++,Java,C#。和PHP有句"PHP是最好的语言" 这种家喻户晓的骚话一样,Python也有...

31570
来自专栏闻道于事

问题整理

  相关子查询,无关子查询 所谓相关子查询,是指求解相关子查询不能像求解普通子查询那样,一次将子查询求解出来,然后求解父查询。相关子查询的内层查询由于与外层查询...

31240

扫码关注云+社区

领取腾讯云代金券