Java 内存管理机制,深入理解JVM
来源:互联网 发布:刺客信条大革命1.5优化 编辑:程序博客网 时间:2024/05/27 21:00
概述:在JVM的自动内存管理机制的支持下,不需要为每一个new的对象进行delete/free。本文将讨论在内存溢出和溢出方面的问题以及数据存放区域。
常见异常:
StackOverFloeError(线程请求栈的深度大于JVM允许的Max Value)
OutOfMemoryError(动态扩展是大于JVM允许的Max Value,注意,这个时候是在扩展,上一个错误是在请求)。
一:数据存放区域。
1.方法区:method Area
这个区域线程共享。存放类加载信息,常量,静态变量,JIT编译后的代码。
里面有运行时常量池,包含符号引用等。
这个区域会出:OutOfMemoryError
2.虚拟机栈 :VM Stack
这个区域是线程私有的。
当方法被执行的时候,这个时候在该区域会创建一个Stack Frame存储局部变量表,操作栈,动态链接,方法出口等信息。一个方法的执行也就意味着一个栈帧在VM Stack里面从入栈到出栈的过程。
这个区域我们着重考虑局部变量表,里面存放了各种的数据类型,只有64位的long和double占用2个局部变量空间,其他的都是一个。
异常:StackOverFloeError,OutOfMemoryError.
3.本地方法栈:Native Method Stack
与虚拟机栈相似,只是他是为Native方法服务,但是虚拟机栈为Java方法(也就是字节码)提供服务。
4.程序计数器:Program Couter Register
该区域较小,可以看做是当前线程的字节码行号指示器,用来选择下一条需要执行的语句。
线程管理:由于线程切换需要恢复到正常的执行的位置,所以一个线程就需要一个程序计数器(线程私有)。
5.堆:Heap
这个区域线程共享。在JVM创建的时候就创建了。对象实例,数组都在这里进行分配。
Java的垃圾回收区域也存放在这个区域(Garbage Collected Heap,采用分代收集算法,详情百度)。
这个区域也会出这个错误:OutOfMemoryError
6.直接内存:Direct Memory
这个区域独立于堆,可以直接使用Native函数分配堆外内存。
每个区域都有创建和销毁的时间,都有各自的用途。
一个面试题:解释内存中的栈(stack)、堆(heap)和方法区(method area)的用法。
答:通常我们定义一个基本数据类型的变量,一个对象的引用,还有就是函数调用的现场保存都使用JVM中的栈空间;而通过new关键字和构造器创建的对象则放在堆空间,堆是垃圾收集器管理的主要区域,由于现在的垃圾收集器都采用分代收集算法,所以堆空间还可以细分为新生代和老生代,再具体一点可以分为Eden、Survivor(又可分为From Survivor和To Survivor)、Tenured;方法区和堆都是各个线程共享的内存区域,用于存储已经被JVM加载的类信息、常量、静态变量、JIT编译器编译后的代码等数据;程序中的字面量(literal)如直接书写的100、”hello”和常量都是放在常量池中,常量池是方法区的一部分,。栈空间操作起来最快但是栈很小,通常大量的对象都是放在堆空间,栈和堆的大小都可以通过JVM的启动参数来进行调整,栈空间用光了会引发StackOverflowError,而堆和常量池空间不足则会引发OutOfMemoryError。
二:对象访问。
Object obj = new Object(); // Object obj放在本地变量中,new的对象放在堆里面。
三:常见的错误产生
OutOfMemoryError 模拟条件:while死循环创建对象,导致Heap溢出,产生OutOfMemoryError StackOverFlow创建大量变量(虚拟栈)
- Java 内存管理机制,深入理解JVM
- 《深入理解JVM》--内存管理机制
- 深入理解JVM-自动内存管理机制
- 深入理解jvm--自动内存管理机制
- JVM内存管理机制----对《深入理解JAVA虚拟机》第二章的理解(上)
- 深入理解Java虚拟机-自动内存管理机制
- 《深入理解Java虚拟机 JVM高级特性与最佳实践》自动内存管理机制
- 深入理解JVM学习笔记-自动内存管理机制
- [jjzhu学java]深入理解JVM笔记之内存管理机制
- 深入理解Linux内存管理机制
- 《深入理解Java虚拟机——JVM高级特性与最佳实践》学习笔记——自动内存管理机制
- 深入理解java虚拟机之自动内存管理机制
- 深入理解Java虚拟机——自动内存管理机制
- 《深入理解JAVA虚拟机》阅读笔记之自动内存管理机制
- 深入理解java虚拟机(一)--自动内存管理机制
- 深入理解java虚拟机 笔记一 ---自动内存管理机制
- 深入理解java虚拟机之自动内存管理机制笔记
- 深入理解java虚拟机读书笔记(二)-内存管理机制
- 滴滴---2017校招---后台开发面经
- STM32学习笔记之时钟分析(受启发有汲取之处)
- LeetCode #44
- C 语言学习笔记01:变量存储方式和存储类别
- 算法课程Leetcode作业第二周技术博客
- Java 内存管理机制,深入理解JVM
- 循环输入和输出二维字符数组
- Sublime Text3开发快捷键(Windows)
- TypeError: object() takes no parameters
- 读书笔记:《演讲的力量(干货版)》
- 【Oracle】NLS_LANG详解
- windows进程(4)
- 指针传递参数的例子
- Mybatis——resultMap的使用方法