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 ...
随机推荐
- (一)NUnit单元测试心得
由于各种缘由,一本<.Net单元测试艺术>突然出现在了我的办公桌上,于是我的单元测试之路就此开始.通过一两个月不间断的学习,以及不断结合具体的项目做开发,再结合书上的知识对单元测试有了一些 ...
- gem install走代理,速度刚刚的
有个树莓pi,安装了shadowsocks 和 cow ,做代理,走ipv6,学校不收ipv6流量钱.速度也不错,快的下载可达10M/s. gem install xx遇到墙了. nano ~/.ge ...
- 《GettingThingsDone》--GTD学习笔记(一)-GTD理论
利用春节假期阅读了<Getting Things Done>一书,下文整理了下阅读过程中做的读书笔记和心得. ==GTD理论== 一. 目的: 1. 收集需要处理的事情把它置于一个脱离大脑 ...
- Node.js中的ORM
ORM2是一款基于Node.js实现的ORM框架,名字相当的霸气,算是同类框架中非常出色的一款,具体介绍请猛击:https://github.com/dresende/node-orm2 刚接触Nod ...
- HDU-4671 Backup Plan 构造解
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4671 假设是3 m,首先按照第一列按照1 2 3 1 2 3 1...排下去,然后个数就是一个 (m/ ...
- Guide to make CentOS 7 the perfect desktop
原文地址: http://www.dedoimedo.com/computers/fedora-pimp.html My original review of CentOS 7 was less e ...
- elecworks中“插入点”的意思
elecworks中自建符号时,”插入点“的用法: 插入点的作用是:建好的符号加入符号库后,从库里调用符号到原理图中时“插入点”就是符号的中心点---鼠标光标拖动的点. (插入点即为符号调出 时插入图 ...
- flashback data archive (转)
闪回数据归档(Flashback Data Archive) 在Oracle 11g当中,对闪回技术再次进行了扩展,提供了一个全新的flashback方式,称之为闪回数据归档,本节我们将对闪回数据归档 ...
- iOS7滑动返回
[转载请注明出处] iOS 7中在传统的左上角返回键之外,提供了右滑返回上一级界面的手势.支持此手势的是UINavigationController中新增的属性 interactivePopGestu ...
- struts2中的json
这里放一个转载的struts2中json的详细应用和范例, http://yshjava.iteye.com/blog/1333104,这是个人在网上看到的很用心也很详细的一份关于struts2中js ...