java内存区域和内存溢出异常--->171224

今天是西方的平安夜,没有过节的任何感觉,我想尽快的把Java、算法、os、网络的知识复习一遍,从而在年前找到一个不错的实习。大概不到两个月的时间就过年,所以时间很是紧迫,我计划准备10天,然后投开始简历,毕竟该忘的都忘了,不该忘的也给忘了,上次去面试就因为什么都没有准备,在算法方面被虐的够够的,最长公共子序列和哈希算法还有算法复杂度的计算,目前待解决。

今天的工作大部分放在了排序算法上,冒泡和快排、插入和希尔、选择和堆排序等,大部分内容写在了笔记本上,不在提及。下面总结一下Java虚拟机里的一些基本内容,主要指的是Java内存区域和内存溢出异常方面的内容。还有归并排序和快排的带有0区的没有搞定,计划把王道数据结构上的非选择题搞一遍!

Java虚拟机所管理的内存包括以下几个运行时的数据区域:程序计数器(PC)、堆、虚拟机栈、本地方法栈、方法区等。

1、程序计数器是一块较小的内存空间,可以看作是当前线程所执行字节码的行号指示器,在虚拟机的概念模型中,字节码解释器工作时就是通过改变程序计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。

在任何一个确定的时刻,一个处理器都只会执行一个线程中的指令。因此,为了线程切换后能恢复到正确的位置,每条线程都需要一个独立的程序计数器,且之间相互不影响,独立存储,我们称这类内存区域为“线程私有”的内存。如果一个线程正在执行一个Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;如果正在执行的是Native方法,这个计数器则为空(Undefined)。

这个区域在Java虚拟机规范中唯一的没有规定任何OutOfMemoryError异常的区域。

2、Java虚拟机栈

java虚拟机栈也是线程私有的,它的生命周期与线程相同。虚拟机栈描述的是java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧(Stack Frame),用于存储局部变量表操作数栈动态链接方法出口等信息。方法调用---栈帧入栈,方法执行完成---出栈。

平常所说java内存分为的堆内存和栈内存(这种划分很粗糙),这两块是与对象内存分配关系最密切内存区域。这里所说的就是java虚拟机栈或者说是虚拟机栈中局部变量表部分。

局部变量表存放了编译期可知的各种基本数据类型、对象引用(句柄和引用有什么关系?)、returnAddress类型(指向了一条字节码指令的地址)。局部变量表所需的内存空间在编译期间完成分配,当进入一个方法时,这个方法需要在帧中分配多大的局部变量空间是确定的,在方法运行期间不会改变局部变量表的大小。

在这个区域规定了两种异常:StackOverflowError(线程请求的栈深度大于虚拟机所允许的深度——>可以动态扩展)、OutOfMemoryError(扩展时无法申请到足够的内存)。

3、本地方法栈:

与java虚拟机栈作用相似,区别在于:虚拟机栈为虚拟机执行的java方法(也就是字节码)服务,而本地方法栈则为虚拟机使用的Native方法服务。此处区域所允许的异常和java虚拟机一样:StackOverflowError(线程请求的栈深度大于虚拟机所允许的深度——>可以动态扩展)、OutOfMemoryError(扩展时无法申请到足够的内存)。也是线程私有的。

综上,线程隔离数据区,也就是线程私有的内存区域:程序计数器、java虚拟机栈、本地方法栈。

4、java堆

是java虚拟机所管理的最大的内存块。java堆是被所有线程所共享的一块内存区域,在虚拟机启动的时候创建。用于存放几乎所有的对象实例。java虚拟机规范描述的是:所有的对象实例以及数组都要在堆上分配。(JIT编译器、逃逸分析技术、栈上分配、标量替换优化技术使得不在“绝对”)

java堆是垃圾收集器管理的主要区域,也被称为“GC堆”。当然,可以根据内存回收或者内存分配还可以更细致的对堆进行划分!

根据java虚拟机规范,java堆可以处于物理上不连续但逻辑上连续的内存。实现时,既可以是固定的也可以是可扩展的。如果在堆中没有内存完成实例分配,并且堆也无法再扩展时,将会抛出OutOfmemoryError异常。

5、方法区

它是线程共享的内存区域,用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。待续。。。

参考:《深入理解Java虚拟机:JVM。。。》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值