JVM的内存区域模型

1、方法区

也称永久代、非堆。 用于存储虚拟机加载的类信息、常量、静态变量,是各个线程共享的内存区域。

默认最小值为16MB,最大值为64MB,可以通过-XX:PermSize和-XX:MaxPermSize参数设置其大小。

运行时常量池是方法区的一部分,class文件中除了有类的版本、字段、方法、接口等描述信息外。

还有一项信息是常量池,用于存放编译器生成的各种符号引用,这部分内容将在类加载后放到方法区

运行时的常量池中。

2、虚拟机栈

每个方法被执行的时候都会创建一个栈帧用于存储局部变量表(包括参数)、操作栈、方法出口灯信息。

每个方法被调用到执行完的过程,就对应着一个栈帧在虚拟机中从入栈道出栈的过程,声明周期与线程

相同,是线程私有的。

局部变量表存放了编译器可知的各种基本数据类型(boolean  byte  char  short  int  float  long  double)、对象

引用(引用指针,并非对象本身),其中64位长度的long和double类型的数据会占用2个局部变量的空间,其余

数据类型只占1个。局部变量表所需的内存空间在编译期完成分配,当进入一个方法时,这个方法需要在栈

帧中分配多大的局部变量是完全确定的,在运行期间栈帧不会改变局部变量表的大小空间。

3、本地方法栈

与栈基本类似,区别在于虚拟机栈为虚拟机执行的java方法服务,而本地方法栈则是为native方法服务

4、堆

GC堆是虚拟机所关联的内存中最大的一块内存区域,也是被各个线程共享的内存区域,JVM启动时创建

该内存区域存放了对象实例及数组(所有new的对象)。其大小通过-Xms(最小值)和-Xmx(最大值)参数

设置,-Xms为JVM启动时申请的最小内存,默认值为操作系统物理内存的1/64但小于1G,-Xmx为JVM可申请

的最大内存,默认为物理内存的1/4但小于1G,默认当空余堆内存大小小于40%时,JVM会增大heap到-Xmx

指定的带下,可通过-XX:MinHeapFreeRation=来指定这个比例;当空余堆内存大于70%时,JVM会减少heap的

大小到-Xms指定的大小,可通过XX:MaxHeapFreeRation=来指定这个比例,对于运行系统,为避免在运行时

频繁调整heap的大小,通常-Xms与-Xmx的值设为一样。

由于现在收集器一般采用分带收集算法,堆被划分为新生代和老年代。新生代主要存储新创建的对象和尚未进入

老年代的对象。老年代存储经过多次新生代GC依然存活的对象。

新生代:程序新创建的对象都是从新生代分配内存,新生代有Eden Space和两块相同大小的Survivor Space构成

可通过-Xmn参数指定新生代的大小,也可以通过-XX:SurvivorRation来调整Eden Space及Survivor Space的大小。

老年代:用于存放经过多次新生代GC依然存活的对象。老年代所占的内存大小为-Xmx-Xmn

5、程序计数器

是最小的一块内存区域,作用是当前线程所执行的字节码的行号指示器,在虚拟机的模型里,字节码

解释权工作就是通过改变这个计数器的值来选取下一条需要执行的字节码指令。

JVM内存组成的更多相关文章

  1. Jvm 内存浅析 及 GC个人学习总结

    从诞生至今,20多年过去,Java至今仍是使用最为广泛的语言.这仰赖于Java提供的各种技术和特性,让开发人员能优雅的编写高效的程序.今天我们就来说说Java的一项基本但非常重要的技术内存管理 了解C ...

  2. jvm系列(二):JVM内存结构

    JVM内存结构 所有的Java开发人员可能会遇到这样的困惑?我该为堆内存设置多大空间呢?OutOfMemoryError的异常到底涉及到运行时数据的哪块区域?该怎么解决呢?其实如果你经常解决服务器性能 ...

  3. jvm内存溢出分析

    概述 jvm中除了程序计数器,其他的区域都有可能会发生内存溢出 内存溢出是什么? 当程序需要申请内存的时候,由于没有足够的内存,此时就会抛出OutOfMemoryError,这就是内存溢出 内存溢出和 ...

  4. jvm内存区域

    概述 jvm内存分为几个区域: 程序计数器 虚拟机栈 本地方法栈 堆 方法区 运行时常量池 直接内存 这些内存区域是在java进程中细分的,为java程序提供服务 不同的区域存储的内容不一样,生命周期 ...

  5. JVM内存管理&GC

    一.JVM内存划分 |--------------------|-------------PC寄存器-------| |----方法区 ---------|--------------java 虚拟机 ...

  6. JVM内存模型、指令重排、内存屏障概念解析

    在高并发模型中,无是面对物理机SMP系统模型,还是面对像JVM的虚拟机多线程并发内存模型,指令重排(编译器.运行时)和内存屏障都是非常重要的概念,因此,搞清楚这些概念和原理很重要.否则,你很难搞清楚哪 ...

  7. JVM内存管理------垃圾搜集器参数精解

    本文是GC相关的最后一篇,这次LZ只是罗列一下hotspot JVM中垃圾搜集器相关的重点参数,以及各个参数的解释.废话不多说,这就开始. 垃圾搜集器文章传送门 JVM内存管理------JAVA语言 ...

  8. Tomcat中JVM内存溢出及合理配置及maxThreads如何配置(转)

    来源:http://www.tot.name/html/20150530/20150530102930.htm Tomcat本身不能直接在计算机上运行,需要依赖于硬件基础之上的操作系统和一个Java虚 ...

  9. 如何设置jvm内存

    本文向大家简单介绍一下进行JVM内存设置几种方法,安装Java开发软件时,默认安装包含两个文件夹,一个JDK(Java开发工具箱),一个JRE(Java运行环境,内含JVM),其中JDK内另含一个JR ...

  10. JVM内存模型和性能优化 转

    JVM内存模型和性能优化 JVM内存模型优点 内置基于内存的并发模型:      多线程机制 同步锁Synchronization 大量线程安全型库包支持 基于内存的并发机制,粒度灵活控制,灵活度高于 ...

随机推荐

  1. iOS---实现简书和知乎的上滑隐藏导航栏下拉显示导航栏效果

    因为自己用简书和知乎比较多,所以对其导航栏的效果比较好奇,自己私下里找资料实现了一下.这个效果的关键点在于下方可供滑动的内容的便宜距离inset的改变,以及滑动的scrollview代理的执行,废话不 ...

  2. linux运维、架构之路-网络基础

    一. 常用网络设备 1.交换机:实现多台主机之间互相通讯的需求 交换机实现互相通讯的要求: ①主机身份标识信息:mac地址,利用源mac和目标mac地址,进行身份信息识别 ②主机通过交换机识别目标主机 ...

  3. BZOJ 4836: [Lydsy1704月赛]二元运算 分治FFT

    Code: #include<bits/stdc++.h> #define ll long long #define maxn 500000 #define setIO(s) freope ...

  4. Android逆向之旅---静态分析技术来破解Apk

    一.前言 从这篇文章开始我们开始我们的破解之路,之前的几篇文章中我们是如何讲解怎么加固我们的Apk,防止被别人破解,那么现在我们要开始破解我们的Apk,针对于之前的加密方式采用相对应的破解技术,And ...

  5. 用flask写一个简单的接口

    用falsk写一个简单的接口,这个接口的数据本来是爬虫爬取的数据,但是今天只写一个flask接口,数据就用测试数据好了. import random import re import time imp ...

  6. execute、executeQuery和executeUpdate之间的区别 转

    转:http://blog.csdn.net/colin_fantasy/article/details/3898070 execute.executeQuery和executeUpdate之间的区别 ...

  7. p4463 [国家集训队] calc

    分析 代码 #include<bits/stdc++.h> using namespace std; ][],Ans; inline int pw(int x,int p){ ; whil ...

  8. 测开之路七十:监控平台之html

    监控平台的html <!-- 继承base模板 -->{% extends "base.html" %} <!-- 引入bootstrap-datetimepic ...

  9. python 微服务方案

    介绍 使用python做web开发面临的一个最大的问题就是性能,在解决C10K问题上显的有点吃力.有些异步框架Tornado.Twisted.Gevent 等就是为了解决性能问题.这些框架在性能上有些 ...

  10. Java thread(3)

    线程间的调度策略 通常是选择优先级高的线程,但是若发生以下情况则终止线程的运行:    1 调用yield 让出对cpu的占用权. 2 调用sleep 3 线程由于I/O操作而受阻 4 更高优先级的线 ...