文档章节

JVM内存区域划分详解

mifans
 mifans
发布于 2017/09/06 10:01
字数 1300
阅读 72
收藏 0

拿午休时间来发了这篇博客,希望对大家有帮助 
本文吸取《深入理解Java虚拟机》与多篇博客精华详细解说了JVM中内存划分的情况。

大多数 JVM 将内存区域划分:

  1. Method Area(Non-Heap)(方法区) ——线程共享

  2. Heap(堆) ——线程共享

  3. Program Counter Register(程序计数器) ——非线程共享

  4. VM Stack(虚拟机栈,也有翻译成JAVA 方法栈的)——非线程共享

  5. Native Method Stack ( 本地方法栈 )——非线程共享

JVM运行的时候会分配好 Method Area(方法区) 和Heap(堆)而JVM 每遇到一个线程,就为其分配一个 Program Counter Register(程序计数器) , VM Stack(虚拟机栈)和Native Method Stack (本地方法栈), 当线程终止时,三者(虚拟机栈,本地方法栈和程序计数器)所占用的内存空间也会被释放掉。 
非线程共享的那三个区域的生命周期与所属线程相同,而线程共享的区域与JAVA程序运行生命周期相同, 
所以gc只发生在线程共享的区域(大部分发生在Heap上)的原因。 
这里写图片描述

线程共享: 
一、方法区

  1. 有时候也称为永久代(Permanent Generation),在该区内很少发生垃圾回收,在这里进行的GC主要是方法区里的常量池和类型的卸载
  2. 方法区主要用来存储已被虚拟机加载的类信息、常量、静态变量和即时编译后的代码等数据。
  3. 方法区里有一个运行时常量池用于存放静态编译产生的字面量和符号引用。运行时生成的常量也会存在这个常量池中。比如String类的intern()方法

扩展:

  • -XX:MaxPermSize设置上限
  • -XX:PermSize设置最小值 例:VM Args:-XX:PermSize=10M -XX:MaxPermSize=10M

二、堆 
在虚拟机启动时创建,几乎所有的对象实例都在这里创建,因此该区域经常发生垃圾回收操作。 
堆空间分为老年代和年轻代。刚创建的对象存放在年轻代,而老年代中存放生命周期长久的实例对象。年轻代中又被分为Eden区(圣经中的伊甸园)、和两个Survivor区(From Space和To Space)。新的对象分配是首先放在Eden区,Survivor区作为Eden区和Old区的缓冲,在Survivor区的对象经历若干次收集仍然存活的,就会被转移到老年代。 
这里写图片描述
堆中垃圾回收的时候注意一个大对象回收过程,描述如下: 
年轻代与老年代控件分配如下:

  • Eden:80M

  • S1:10M

  • S2:10M

  • 老年代:100M

过程:

  1. 新建60M的对象O1,此时Eden有足够内存吃下,所以60M被分配到Eden区
  2. 再新建40M对象O2,此时因为S1和S2的控件不足以容纳下O1,所以O1被直接分配到老年代,而O2进入Eden区
  3. 清空O1、O2,新建90M对象O3,发现Eden不足以放下O3,O3被直接放入老年代中
  4. 清空O3,新建110M对象O4,O4发现Eden和老年代都没有足够控件,直接返回OutOfMemoryError

结论:

  • 当一个对象大于eden区而小于old区(老年代)时的时候会直接扔到old区。 
    而但对象大于old区时,会直接抛出OutOfMemoryError(OOM)

    扩展: 
    参数-XX:PretenureSizeThreshold:这个参数的单位是Byte, 
    其作用是当新对象申请的内存空间大于这个参数值的时候,直接扔到old区。 
    -Xms:设置最小值 
    -Xmx:设置最大值 例:VM Args: -Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError 
    若-Xms=-Xmx,则可避免堆自动扩展。 
    -XX:+HeapDumpOnOutOfMemoryError: 
    JVM会在遇到OutOfMemoryError时拍摄一个“堆转储快照”,并将其保存在一个文件中

线程私有: 
一、虚拟机栈:

  1. 虚拟机栈也就是我们平常所称的栈内存,它为java方法服务,每个方法在执行的时候都会创建一个栈帧,用于存储局部变量表、操作数栈、动态链接和方法出口等信息。
  2. 局部变量表里存储的是基本数据类型和对象引用。局部变量所需的内存空间在编译器间确定
  3. 每个栈帧都包含一个指向运行时常量池中该栈帧所属方法的引用,持有这个引用是为了支持方法调用过程中的动态连接.动态链接就是将常量池中的符号引用在运行期转化为直接引用。

-Xoss参数设置本地方法栈大小(对于HotSpot无效) 
-Xss参数设置栈容量 例: -Xss128k

二、本地方法栈 
本地方法栈和虚拟机栈类似,只不过本地方法栈为Native方法服务。

三、程序计数器 
代表着当前线程所执行字节码的行号指示器。 
分支、循环、跳转、异常处理和线程恢复等功能都需要依赖这个计数器完成。 
程序计数器是唯一一个java虚拟机规范没有规定任何OOM(Out Of Memory)情况的区域。

本文转载自:http://blog.csdn.net/jackcaptain1015/article/details/71195010

mifans
粉丝 11
博文 204
码字总数 103669
作品 0
海淀
程序员
私信 提问
JVM系列篇:深入详解JVM内存模型与JVM参数详细配置

本系列会持续更新。 JVM基本是BAT面试必考的内容,今天我们先从JVM内存模型开启详解整个JVM系列,希望看完整个系列后,可以轻松通过BAT关于JVM的考核。 BAT必考JVM系列专题 1.JVM内存模型 2....

mikechen优知
03/26
86
0
深入理解 Java 虚拟机学习(一) -- java 内存区域与内存溢出异常

java 内存区域 要进行 java 虚拟机的深入学习,首先要了解的是 java 的内存划分。大部分程序员一开始接触 java ,对于内存的划分是印象是堆内存和栈内存,而这仅仅适合于入门的学习,实际上 ...

偷星辰夜
2017/09/28
0
0
JVM内存结构 VS Java内存模型 VS Java对象模型

Java作为一种面向对象的,跨平台语言,其对象、内存等一直是比较难的知识点。而且很多概念的名称看起来又那么相似,很多人会傻傻分不清楚。比如本文我们要讨论的JVM内存结构、Java内存模型和...

Java架构
2018/07/11
0
0
图说 Java:理解 Java 机制最受欢迎的 8 幅图

世间总是一图胜过千万言,下面的8幅图来自于 Program Creek 的 Java教程 ,目前这是该网站最受欢迎的文章. 希望本文能帮你回顾你已经知道的那些知识。如果图片讲解的不够清晰,你可能需要阅读详...

大数据之路
2013/10/30
1K
4
Java虚拟机内存管理(一)—内存划分

Java 与 C++ 之间有一堵由内存动态分配和垃圾收集技术所围成的 “高墙”,墙外面的人想进去,墙里面的人却想出来。——《深入理解Java虚拟机:JVM高级特性与最佳时实践(第二版)》周志明 Ja...

Wizey
2018/08/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

【AngularJS学习笔记】02 小杂烩及学习总结

本文转载于:专业的前端网站☞【AngularJS学习笔记】02 小杂烩及学习总结 表格示例 <div ng-app="myApp" ng-controller="customersCtrl"> <table> <tr ng-repeat="x in names | orderBy ......

前端老手
昨天
13
0
Linux 内核的五大创新

在科技行业,创新这个词几乎和革命一样到处泛滥,所以很难将那些夸张的东西与真正令人振奋的东西区分开来。Linux内核被称为创新,但它又被称为现代计算中最大的奇迹,一个微观世界中的庞然大...

阮鹏
昨天
9
0
【Medium 万赞好文】ViewModel 和 LIveData:模式 + 反模式

原文作者: Jose Alcérreca 原文地址: ViewModels and LiveData: Patterns + AntiPatterns 译者:秉心说 View 和 ViewModel 分配责任 理想情况下,ViewModel 应该对 Android 世界一无所知。...

秉心说
昨天
15
0
重学计算机组成原理(十二) - 异常和中断

1 概览 完好的程序都满足以下特征 自动运行 我们的程序和指令都是一条条顺序执行,不需要通过键盘或者网络给这个程序任何输入 正常运行 没有遇到计算溢出之类的程序错误。 不过,现实的软件世...

JavaEdge
昨天
11
0
程序设计基础(C)第06讲例程

1summing.c /* summing.c -- 根据用户键入的整数求和 */#include <stdio.h>int main(void){ long num; long sum = 0L; /* 把sum 初始化为0 */ int status; p......

树人大学数字媒体吴凡
昨天
12
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部