jvm内存模型及分配参数
jvm内存模型
- 程序计数器:是一块很小的内存空间。当线程数量超过cpu数量时,线程之间根据时间片轮询抢夺cpu资源。每一个线程都必须用一个独立的程序计数器,用于记录下一条要运行的指令。
- java虚拟机栈(线程栈 ):也是线程私有内存空间,他和java线程在同一时间创建,他保存方法的局部变量、部分结果,并参与方法的调用和返回。如果线程在计算过程中,请求的栈深度大于最大可用的栈深度,则抛出StackOverflowError;如果java栈可以动态扩展,而在扩展的过程中,操作系统没有足够的内存空间来支持栈的扩展,则抛出OutOfMemoryError;——参数设置参见《设置线程栈 》
- 本地方法栈:用于管理本地方法的调用,本地方法是使用C实现的。
- java堆:堆空间分为新生代和老年代。新生代用于存放产生的新对象,老年代用于存放年长的对象(存在 时间较长,经过垃圾回收次数较多的对象)。新生代又可以细分为eden,s0和s1,eden大部分对象刚建立时,通常放在这里。s0和s1为survivor空间,也就是说存放其中的对象至少经历了一次垃圾回收,并得以幸存。如果幸存区的对象到了指定的年龄仍未被回收,则有机会进入老年代。
- 方法区:与堆空间类似,也是被jvm的所有线程共享的,主要保存的是类的类型信息、常量池、域信息、方法信息等元数据。


设置最大、最小堆内存
- 用-Xmx指定最大堆内存,最大堆内存指的是新生代和老年代的大小之和的最大值,它是java应用程序的堆上线。
- 用-Xms指定最小堆内存,也就是jvm启动时,所占据的操作系统内存大小。
- 当-Xms指定的内存大小确实无法满足应用程序是,jvm才会向操作系统申请更多的内存,直至达到-Xmx指定的内存大小为止。 如果-Xms的数值较小,那么jvm为了保证系统尽可能的在指定内存范围内运行,就会频繁的进行gc操作,以释放失效的内存空间,从而,会增加Minor GC和Full GC的次数,对系统性能产生一定影响。所以,把-Xms值设置为-Xmx时,可以在系统运行初期减少gc的次数和耗时。
设置线程栈
- 线程栈是线程的一块私有空间,可以用-Xss设置线程栈的大小,栈的大小直接决定了函数调用的可达深度。
- 在线程中进行局部变量分配,函数调用时,都需要在栈中开辟空间。
- 如果栈的空间分配太小,那么线程在运行时,可能没有足够的空间分配局部变量或者达不到足够的函数调用深度,导致程序异常退出;如果栈空间过大,那么开设线程所需的内存成本就会上升,系统所能支持的线程总数就会下降。
- java堆和线程栈都是像操作系统申请内存空间,如果堆空间过大,就会导致操作系统可用于线程栈的内存减小,当系统由于内存不够而无法创建新的线程时,会抛出OOM异常(注意这个OOM不是堆内存不足)。所以,如果系统确实需要大量线程并发执行,那么设置一个较小的堆和较小的栈,有助于提高系统所能承受的最大线程数。
设置新生代
- 用-Xmn指定新生代的大小,新生代的大小一般设置为整个堆空间的1/4到1/3。设置一个较大或较小的新生代对系统性能已经gc行为有很大影响。
- 使用-XX:NewSize设置新生代的初始大小,-XX:MaxNewSize设置新生代的最大值。通常情况下只设置-Xmn即可满足需要。
设置持久代
- 持久代(方法区)不属于堆得一部分,使用-XX:MaxPermSize设置持久代最大值,使用-XX:PermSize设置持久代最小值。
- 持久代的大小直接决定了系统可以支持多少个类定义和多少常量。
- 一般MaxPermSize设置为64M或128M。
取得堆快照(堆dump)
jvm内存模型及分配参数的更多相关文章
- JVM内存模型和关键参数设置
一. JVM内存模型: Jvm内存模型是学好Java很重要的一部分,该部分学习能让我们在系统运维的时候,或者优化服务器的时候能够有方法,懂原理. 二. Jvm关键参数: 1. 堆大小设置参数: -Xm ...
- jvm内存模型及分配
1.什么是jvm?(1)jvm是一种用于计算设备的规范,它是一个虚构出来的机器,是通过在实际的计算机上仿真模拟各种功能实现的.(2)jvm包含一套字节码指令集,一组寄存器,一个栈,一个垃圾回收堆和一个 ...
- jvm内存模型、常见参数及调优
JVM内存结构: 主要分为:方法区.堆.虚拟机栈.本地方法栈.程序计数器,其中方法区和堆是线程共享的,其他的都是线程隔离的. 方法区: 主要存放类的信息.静态变量.常量.编译后的方法代码,永久代Per ...
- JVM内存模型和启动参数的关系
今天开始接触JVM的内存模型这一块的内容,以下这张图是从网上找的,先收藏了,虽然现在还看不太懂.以后弄懂了才进行详细的解说.
- JVM内存模型及配置参数
JVM 分为堆.栈.方法区.程序计数器.本地方法栈 栈内存存放局部变量表.操作栈.动态链接.方法出口等信息 1. 局部变量表存放了编译期可知的各种基本数据类型(boolean.byte.char.s ...
- 记录JVM内存模型,参数含义和优化
一.JVM内存模型 (图片来自网络) 根据Java虚拟机规范,JVM将内存划分为: New(年轻代) Tenured(年老代) Perm (永久代) 其中New和Tenured属于堆内存,堆内存会从J ...
- 直通BAT必考题系列:深入详解JVM内存模型与JVM参数详细配置
VM基本是BAT面试必考的内容,今天我们先从JVM内存模型开启详解整个JVM系列,希望看完整个系列后,可以轻松通过BAT关于JVM的考核. BAT必考JVM系列专题 1.JVM内存模型 2.JVM垃圾 ...
- jvm内存模型和内存分配
1.什么是jvm? (1)jvm是一种用于计算设备的规范,它是一个虚构出来的机器,是通过在实际的计算机上仿真模拟各种功能实现的. (2)jvm包含一套字节码指令集,一组寄存器,一个栈,一个垃圾回收堆和 ...
- JVM内存模型及内存分配过程
一.JVM内存模型 JVM主要管理两种类型内存:堆(Heap)和非堆(Permanent区域). 1.Heap是运行时数据区域,所有类实例和数组的内存均从此处分配.Heap区分两大块,一块是 Youn ...
随机推荐
- Python的数据类型的一些知识
int 类型表示(正负)整数,str 类型表示字符串(Unicode字符序列): 所表示的整数大小只受限于机器内存,而非固定的字节数. 字符串可以用双引号或是单引号封装,需要成对的出现. 传统上,py ...
- openvpn文本验证模式配置
证书模式要为每个客户端生成一个证书,虽说安全性较好,但是比较麻烦,可以配置成用户名/密码的验证模式,这样就比较方便了,我这里用最简单的文本验证模式. 一.安装openvpn 不多说了,之前有篇文章已经 ...
- 看雪 安卓 dex文件
http://bbs.pediy.com/showthread.php?t=177114
- Python:itertools模块
itertools模块包含创建有效迭代器的函数,可以用各种方式对数据进行循环操作,此模块中的所有函数返回的迭代器都可以与for循环语句以及其他包含迭代器(如生成器和生成器表达式)的函数联合使用. ch ...
- NIOP1995 石子合并(区间DP)
状态转移方程在代码中标出 本题注意是圆形,所以之前要预先处理一下s数组.处理之后总长度为2*n-1.第一个合并的起点有n个,所以总的方案数是n 注释在代码中标出 http://www.rqnoj.cn ...
- debian 显示器使用自定义分辨率
比如你要使用 1440x900 的自定义分辨率,先利用 cvt 计算一个新的 modeline $ cvt 1440 900 输出为: # 1440x900 59.89 Hz (CVT 1.30MA ...
- [OC Foundation框架 - 22] 集合的内存管理
A.集合的手动内存管理 NSArray addObject: 加入的元素执行一次retain removeObject: 被删除的元素执行一次release removeAllObjects: 所有元 ...
- [Objective-c 基础 - 1.3] OC带返回值的类方法
/* 计算器类 1>返回π 2>计算两个整数的平方 3>计算两个整数的和 */ #import <Foundation/Foundation.h> @interface ...
- ALM11 OTA API接口的问题
ALM11 在安装的时候好像不会自动加载OTA接口. 正常情况下, OTA的接口文件的路径为: C:\Program Files\Common Files\Mercury Interactive\Qu ...
- 也谈SSO,一个简单实用的单点登录Demo
关于SSO(单点登录),百度百科解释如下 : “SSO英文全称Single Sign On,单点登录.SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统.它包括可以将这次主要 ...