【转】JVM内存模型
http://longdick.iteye.com/blog/473866
/**
* 转载请注明作者longdick http://longdick.iteye.com
*
*/
Java 的内存模型由3个代组成,各个代的默认排列有如下图(适用JDK1.4.* 到 JDK6):

Java 的内存模型分为
Young(年轻代)
Tenured(终身代)
Perm(永久代)
有些旧版本也叫作
New
Old
Perm
叫法不同,表达的意思却是基本相同。
注意Young(年轻代)还可以分为Eden区和两个Survivor区(from和to,这两个Survivor区大小严格一至),新的对象实例总是首先放在Eden区,Survivor区作为Eden区和
Tenure(终生代)的缓冲,可以向
Tenure(终生代)转移活动的对象实例。
Tenure(终生代)中存放生命周期长久的实例对象,但并不是如它的名字那样是终生的,里面的对象照样会被回收掉。
Young和Tenure共同组成了堆内存。
Perm(永久代)则是非堆内存的组成部分。主要存放加载的Class类级对象如class本身,method,field等等。
有同学可能已经注意到了,每个代都有的Virtual区又是什么?
我们知道有一些参数可以影响以上各代的大小。
在JVM启动时,就已经保留了固定的内存空间给Heap内存,这部分内存并不一定都会被JVM使用,但是可以确定的是这部分保留的内存不会被其他进程使用。这部分内存大小由 -Xmx
参数指定。
而另一部分内存在JVM启动时就分配给JVM,作为JVM的初始Heap内存使用。影响这个的参数是 -Xms
,如果 -Xms
指定的值比-Xmx
的小,那么两者的差值就是Virtual内存值。随着程序的运行,Eden区、 Tenured区和Perm区会逐渐使用保留的Virtual空间。
如果没有具体指定,初始和最大堆内存将根据机器的内存计算得出。参数DefaultInitialRAMFraction
和 DefaultMaxRAMFraction
会影响最终的结果,如下表所示:
Formula
Default
| initial heap size |
memory / DefaultInitialRAMFraction
|
memory /64
|
| maximum heap size |
MIN(memory / DefaultMaxRAMFraction, 1GB)
|
MIN(memory/ 4, 1GB)
|
可以看到堆内存默认值最大不会超过1G。
JVM会根据堆内存的使用情况自动决定何时扩张和缩减实际堆内存的大小,可以用VM参数 -XX:MinHeapFreeRatio=<minimum>
和
-XX:MaxHeapFreeRatio=<maximum>
使用堆内存空闲百分比来定义,一般在32位机器上的默认值如下:
Parameter
Default Value
MinHeapFreeRatio
|
40
|
MaxHeapFreeRatio
|
70
|
-Xms
|
3670k
|
-Xmx
|
64m
|
当空闲堆内存所占堆内存百分比低于40%,JVM就会试图扩张堆内存空间;当空闲堆内存所占堆内存百分比高于70%,JVM就会试图压缩堆内存空间。
ps:以上默认值在不同平台会有不同的值,如果是64位系统,这些值一般需要扩张30%,来容纳在64位系统下变大的对象。
加上-XX:NewRatio=3
意味着 young(年轻代) 和 tenured(终生代)的比率是1:3,也就是说,eden区和survivor区容量之和将占总堆内存的1/4。
加上-XX:SurvivorRatio=6
设置eden区和 其中一个survivor space的比率是1:6,也就是说,其中一个survivor space占年轻代1/8的容量 (可以想想为什么不是1/7)。
另外还有 -XX:NewSize
-XX:MaxNewSize
指定年轻代的初始值和最大值。
32位系统下默认值如下:
Default Value
Parameter
Client JVM
Server JVM
NewRatio
|
8
|
2
|
NewSize
|
2228K
|
2228K
|
MaxNewSize
|
not limited
|
not limited
|
SurvivorRatio
|
32
|
32
|
延伸阅读:
参考资料:
http://java.sun.com/javase/technologies/hotspot/gc/gc_tuning_6.html
JVM:堆、栈、方法区:http://www.open-open.com/lib/view/open1432200119489.html
类的生命周期 http://blog.csdn.net/ns_code/article/details/17881581
【深入Java虚拟机】之一:Java内存区域与内存溢出:http://blog.csdn.net/ns_code/article/details/17565503
【转】JVM内存模型的更多相关文章
- JVM内存模型、指令重排、内存屏障概念解析
在高并发模型中,无是面对物理机SMP系统模型,还是面对像JVM的虚拟机多线程并发内存模型,指令重排(编译器.运行时)和内存屏障都是非常重要的概念,因此,搞清楚这些概念和原理很重要.否则,你很难搞清楚哪 ...
- JVM内存模型和性能优化 转
JVM内存模型和性能优化 JVM内存模型优点 内置基于内存的并发模型: 多线程机制 同步锁Synchronization 大量线程安全型库包支持 基于内存的并发机制,粒度灵活控制,灵活度高于 ...
- JVM内存模型和性能优化
JVM内存模型优点 内置基于内存的并发模型: 多线程机制 同步锁Synchronization 大量线程安全型库包支持 基于内存的并发机制,粒度灵活控制,灵活度高于数据库锁. 多核并行计算模 ...
- JVM初探 -JVM内存模型
JVM初探 -JVM内存模型 标签 : JVM JVM是每个Java开发每天都会接触到的东西, 其相关知识也应该是每个人都要深入了解的. 但接触了很多人发现: 或了解片面或知识体系陈旧. 因此最近抽时 ...
- JVM内存模型和关键参数设置
一. JVM内存模型: Jvm内存模型是学好Java很重要的一部分,该部分学习能让我们在系统运维的时候,或者优化服务器的时候能够有方法,懂原理. 二. Jvm关键参数: 1. 堆大小设置参数: -Xm ...
- 记录JVM内存模型,参数含义和优化
一.JVM内存模型 (图片来自网络) 根据Java虚拟机规范,JVM将内存划分为: New(年轻代) Tenured(年老代) Perm (永久代) 其中New和Tenured属于堆内存,堆内存会从J ...
- jvm内存模型和内存分配
1.什么是jvm? (1)jvm是一种用于计算设备的规范,它是一个虚构出来的机器,是通过在实际的计算机上仿真模拟各种功能实现的. (2)jvm包含一套字节码指令集,一组寄存器,一个栈,一个垃圾回收堆和 ...
- JVM的stack和heap,JVM内存模型,垃圾回收策略,分代收集,增量收集
(转自:http://my.oschina.net/u/436879/blog/85478) 在JVM中,内存分为两个部分,Stack(栈)和Heap(堆),这里,我们从JVM的内存管理原理的角度来认 ...
- Java基础知识强化100:JVM 内存模型
一. JVM内存模型总体架构图: 方法区和堆由所有线程共享,其他区域都是线程私有的 二. JVM内存模型的结构分析: 1. 类装载器(classLoader) 类装载器,它是在java虚拟机中用途是 ...
随机推荐
- 在Eclipse上建立hadoop2.2.0/hadoop2.4.0源代码阅读环境
1.安装依赖的包: yum install gcc-c++ g++ autoconf automake libtool cmake zlib1g-dev pkg-config libssl-dev 2 ...
- python 语法常用 lambda
Python中lambda表达式学习 http://blog.csdn.net/imzoer/article/details/8667176
- Mytophome Deal
using AnfleCrawler.Common; using System; using System.Collections.Generic; using System.Linq; using ...
- 对比学习UIKit和AppKit -- ViewController
在iOS中ViewController的基类是UIViewController:Mac中ViewController的基类是NSViewController. Mac中ViewController父类 ...
- FlashBuilder使用
打开调用层次视图,显示当前类.变量被谁调用,右侧显示调用位置. ctrl+alt+H 快捷键 导航即浏览菜单中,单击. 右键单击打开. 为组件生成事件处理函数 组件==控件,按钮等.右侧属性,又叫属性 ...
- 使用python-openCV对摄像头捕捉的镜头进行二值化并打上文字
用CaptureFromCAM函数对图像进行提取: capture = cv.CaptureFromCAM(0) 读取直接的视频文件只需将语句改变为: capture = cv.VideoCaptur ...
- SAP web 开发 (第二篇 bsp 开发 mvc模式 Part1 )
Model-View-Controller 简称MVC. 简单的说就是把数据处理,显示,页面事件及处理过程分离开来,企业应用多数都采用这种方式,多层架构的优缺点不再多言,google一下啥都知道. 在 ...
- ssh连接linux服务器只显示-bash-4.1#不显示路径解决方法
ssh连接linux服务器只显示-bash-4.1#不显示路径时,我们只需要修改 ~/.bash_profile文件,如果不存在这个文件,那么新建一个,增加内容 export PS1='[\u@\ ...
- 第三个Sprint冲刺第五天
讨论地点:宿舍 讨论成员:邵家文.李新.朱浩龙.陈俊金 讨论问题:继续昨天的工作
- F - To the Max
Given a two-dimensional array of positive and negative integers, a sub-rectangle is any contiguous s ...