您的位置:首页 > 编程语言 > Java开发

[java基础] java 虚拟机内存机制

2015-04-29 09:49 393 查看

了解java虚拟器内存机制的好处

当我们需要解决一些棘手的问题,比如性能优化,解决OOM异常时,如果我们了解java虚拟机的内存机制,就知道从哪里下手处理这些问题了

如何了解

我从三方面去说明他

进程级别

我们在pc上做一个应用,在手机上做一个app,都是以进程的级别存在的。在进程这个级别中,内存被分配给/分配为 java堆、方法区(含有常量存储区)、各个线程

java堆:java堆是GC线程回收内存的区域,他主要是用来存储各种对象
方法区:方法区存储了class在加载之后的信息,如全局变量,方法等
常量存储区:静态变量存储区是包含在方法区之中的,他用来存放各种static final常量,这个内存区是可变的

除了java堆和方法区,其他的内存空间就分配给各个线程了

在这些内存区内都会有可能出现OOM异常的

线程级别

程序计数器:每一个线程都会有一个程序计数器,这个在debug的时候跟踪走到哪一步。程序计数器使用的内存很少,而且这部分是不会产生OOM异常的!
java虚拟机栈:顾名思义,java虚拟机栈是以栈的方式存在的,所以他的访问速度要比堆快的多。java虚拟机栈存储的是本地变量,java的基本数据类型,对象类型/array类型存储的是指向java堆的地址
native方法栈:native方法栈对应java虚拟机栈存储的是native方法的内容
栈和堆不同之处,栈是会抛出stackOverflowException的,不过也有可能会抛出OOM,但是在实战中,stack的内存超出了内存限制,一般抛出的都是stackOverflowException

其他

直接内存:直接内存是在NIO时会用到,他是为了避免native堆和本地堆来回copy数据,而实现的技术

以上内容,如有错误,请大神们指正
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息