Java中的内存划分
Java程序在运行时,需要在内存中分配空间。为了提高运行效率,就对数据进行了不同的空间划分。因为每一片区域都有特定的数据处理方式和内存管理方式。

具体分为5种内存空间:
程序计数器:保证线程切换后能恢复到原来的执行位置。
虚拟机栈:(栈内存)为虚拟机执行java方法服务,方法被调用时,创建栈帧-
本地方法栈:为虚拟机执行使用到的Native方法服务
堆内存:存放所有new出来的东西
方法区:存储被虚拟机加载的类信息,常量,静态常量,静态方法等。
运行时常量池(方法区的一部分)
GC对他们的回收:
内存区域中的程序计数器、虚拟机栈、本地方法栈这3个区域随着线程而生,线程而灭;栈中的栈帧随着方法的进入和退出而有条件的执行出栈和入栈的操作。每个栈帧中分配多少内存基本是在类结构确定下来时就已知的。在这个区域不需要过多的考虑回收的问题,因为方法结束或者线程结束时,内存自然就跟着回收了。
GC回收的主要对象:Java堆和方法区
一个接口中的多个实现类需要的内存可能不同,一个方法中的多个分支需要的内存也可能不一样,我们只有在程序处于运行期间时才能知道会创建哪些对象,这部分内存的分配和回收都是动态的,GC关注的也是这部分内存。
1.程序计数器:(线程私有)
每隔线程拥有一个程序计数器,在线程创建时创建,指向吓一跳指令的地址
执行本地方法时,其值为undefined。
说的通俗一点,我们知道,Java是支持多线程的,程序先去执行A线程,执行到一半然后去执行B线程,然后又跑去接着执行A线程,那程序是怎么记住A线程已经执行到哪里了呢?这就需要程序计数器了。因此,为了线程切换后能够恢复到正确执行的位置,每条线程都有一个独立的程序计数器,这块属于“线程私有”的内存。
2.Java虚拟机栈(线程私有)
每隔方法被调用的时候会创建一个栈帧,用于存储局部变量表,操作栈,动态链接,方法出口等信息。局部变量表存放的是:编译器可知的基本数据类型,对象引用类型。
每个方法被调用直到执行完的过程,就对应着一个栈帧在虚拟机中从引入到出栈的过程。
在Java虚拟机中,对这个区域规定了两种异常情况:
(1)如果线程请求的栈深度太深,超出了虚拟机所允许的深度,就会出现StackOverFlowError(比如无线递归,因为每一层栈帧都会占用一定空间,erXss规定了栈的最大空间,超出这个值就会报错)
(2)虚拟机栈可以动态扩展,如果扩展到无法申请足够的内存空间,会出现OOM(OutOfMemory)
3.本地方法栈:
(1)本地方法栈与java虚拟机栈做用户非常相似,区别是:java虚拟机栈是为虚拟机执行java方法服务的而本地方法栈则是为虚拟机使用到Native方法服务。
(2)Java虚拟机没有对本地方法栈的使用和数据结构做强制规定,Sun HotSpot虚拟机就把java虚拟机栈和本地方法栈合二为一。
(3)本地方法栈也会抛出StackOverFlowError和OutOfMemoryError
4.Java堆:堆内存
(1)堆是Java虚拟机所管理的内存区域中罪的的一块,java堆是被所有县城共享的内存区域,在java虚拟机启动时创建堆内存的唯一目的就是存放对象实例,几乎所有的对象实例都在堆内存分配。
(2)堆是GC管理的主要区域,从垃圾回收的角度看,由于现在的垃圾收集器都是采用的粉黛手机算法,因此java堆还可以初步细分为新生代和老年代。
(3)Java虚拟机规定,堆可以处于物理上不连续的内存空间中,只要逻辑上连续的即可。在实现的既可以是固定的,也可以是动态扩展的。如果在堆内存没有完成实力分配,并且对大小也无法扩展,就会抛出OutOfMemoryError异常。
5.方法区(线程共享)
(1)用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码数据。
(2)Sun HotSpot虚拟机把方法区叫做永久带(permanent Generation),方法区中最终要的部分是运行时常量池。
6.运行时常量池:
(1)运行时常量池是方法区的一部分,自然受到方法区内存的限制,当常量池无法再申请到内存时就会抛出OutOfMemoryError异常。
可以参考http://www.cnblogs.com/smyhvae/p/4748392.html
Java中的内存划分的更多相关文章
- java中的内存划分和一个数组的内存图
内存概述 内存是计算机中的重要原件,临时存储区域,作用是运行程序.我们编写的程序是存放在硬盘中的,在硬盘中的程序是不会运行的,必须放进内存中才能运行,运行完毕后会清空内存 Java虚拟机要运行程序 ...
- Java中堆内存和栈内存详解2
Java中堆内存和栈内存详解 Java把内存分成两种,一种叫做栈内存,一种叫做堆内存 在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配.当在一段代码块中定义一个变量时,ja ...
- 关于Hash集合以及Java中的内存泄漏
<学习笔记>关于Hash集合以及Java中的内存泄漏 标签: 学习笔记内存泄露hash 2015-10-11 21:26 58人阅读 评论(0) 收藏 举报 分类: 学习笔记(5) 版 ...
- java中的内存溢出和内存泄漏
内存溢出:对于整个应用程序来说,JVM内存空间,已经没有多余的空间分配给新的对象.所以就发生内存溢出. 内存泄露:在应用的整个生命周期内,某个对象一直存在,且对象占用的内存空间越来越大,最终导致JVM ...
- 初识:java虚拟机的内存划分
什么是内存? 内存是计算机中的重要原件,临时存储区域,作用是运行程序.我们编写的程序是存放在硬盘中的,在硬盘中的程序是不会运行的,必须放进内存中才能运行,运行完毕后会清空内存.Java虚拟机要运行程序 ...
- Java中JVM内存结构
Java中JVM内存结构 线程共享区 方法区: 又名静态成员区域,包含整个程序的 class.static 成员等,类本身的字节码是静态的:它会被所有的线程共享和是全区级别的: 属于共享内存区域,存储 ...
- java中栈内存与堆内存(JVM内存模型)
java中栈内存与堆内存(JVM内存模型) Java中堆内存和栈内存详解1 和 Java中堆内存和栈内存详解2 都粗略讲解了栈内存和堆内存的区别,以及代码中哪些变量存储在堆中.哪些存储在栈中.内存中的 ...
- java中的内存一般分成几部分?
java中的内存被分成以下四部分: ①.代码区 ②.栈区 ③.堆区 ④.静态区域 栈区:由编译器自动分配释放,存放函数的参数值.局部变量的值等:具体方法执行结束后,系统自动释放JVM内存资源 ...
- Java SE之Java中堆内存和栈内存[转/摘]
[转/摘]1-3Java中堆内存和栈内存 注解:内存(Memory)即 内存储器,主存,其作用是用于暂时存放CPU中的运算数据,以及与硬盘等外部存储器(辅存)交换的数据. Java中把内存分为两种:栈 ...
随机推荐
- c#面向对象基础5
字符串 string (1)字符串的不可变性 当给字符串重新赋值时,老值没有被销毁,而是重新开辟了一块新的空间去储存新值<------------------堆中,在栈中地址发生变化重新指向新 ...
- elk6.22
启动错误: 参考网站:https://blog.csdn.net/feinifi/article/details/73633235?utm_source=itdadao&utm_medium= ...
- zabbixzabbix
一,安装文档 https://www.zabbix.com/documentation/4.0/zh/manual/installation/requirements zabbix3.2.6安装 ...
- Spring cron 定时调度配置
IDEA 或者 STS http://spring.io/guides/gs/scheduling-tasks/ spring mvc : 结构: Seconds Minutes Hours Day ...
- ubuntu 安装qq方案
from: http://blog.csdn.net/fuchaosz/article/details/51919607 安装wineQQ国际版 VirtualBox安装windows,再安装QQ,然 ...
- mysql的collation-字符集
utf8_general_ci :排序规则 utf8 -- UTF-8 Unicode :字符集 一.通过my.cnf文件增加(一劳永逸)两个参数:1.在[mysq ...
- 分享 - 27 个机器学习、数学、Python 速查表
转载自:伯乐在线 - iPytLab,原文链接,侵删 机器学习涉及到的方面非常多.当我开始准备复习这些内容的时候,我找到了许多不同的”速查表”, 这些速查表针对某一主题都罗列出了所有我需要知道的知 ...
- vim跳转到指定行
第一种方法 在编辑模式下(非输入模式)下输入ngg 或者 nGn为指定的行数(如25)25gg或者25G 跳转到第25行. 25gg 第二种方法 在命令模式下输入行号n : n 查看当然光标所在的行和 ...
- javascript获取事件源对象和产生事件的对象
事件源对象是指event对象,其封装了与事件相关的详细信息,比如按键状态. 获取事件源对象的方法 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1. ...
- zabbix出现中文不能选的情况
像这里一样,有些选项是选不了的,这个时候我们要做的第一步就是,找到这个配置文件. 如果不知道在哪里的话可以用find命令查找. sudo find / -name locales.inc.php 找到 ...