jvm内存模型

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

设置最大、最小堆内存

  1. 用-Xmx指定最大堆内存,最大堆内存指的是新生代和老年代的大小之和的最大值,它是java应用程序的堆上线。
  2. 用-Xms指定最小堆内存,也就是jvm启动时,所占据的操作系统内存大小。
  3. 当-Xms指定的内存大小确实无法满足应用程序是,jvm才会向操作系统申请更多的内存,直至达到-Xmx指定的内存大小为止。 如果-Xms的数值较小,那么jvm为了保证系统尽可能的在指定内存范围内运行,就会频繁的进行gc操作,以释放失效的内存空间,从而,会增加Minor GC和Full GC的次数,对系统性能产生一定影响。所以,把-Xms值设置为-Xmx时,可以在系统运行初期减少gc的次数和耗时

设置线程栈

  1. 线程栈是线程的一块私有空间,可以用-Xss设置线程栈的大小,栈的大小直接决定了函数调用的可达深度。
  2. 在线程中进行局部变量分配,函数调用时,都需要在栈中开辟空间。
  3. 如果栈的空间分配太小,那么线程在运行时,可能没有足够的空间分配局部变量或者达不到足够的函数调用深度,导致程序异常退出;如果栈空间过大,那么开设线程所需的内存成本就会上升,系统所能支持的线程总数就会下降。
  4. java堆和线程栈都是像操作系统申请内存空间,如果堆空间过大,就会导致操作系统可用于线程栈的内存减小,当系统由于内存不够而无法创建新的线程时,会抛出OOM异常(注意这个OOM不是堆内存不足)。所以,如果系统确实需要大量线程并发执行,那么设置一个较小的堆和较小的栈,有助于提高系统所能承受的最大线程数

设置新生代

  1. 用-Xmn指定新生代的大小,新生代的大小一般设置为整个堆空间的1/4到1/3。设置一个较大或较小的新生代对系统性能已经gc行为有很大影响。
  2. 使用-XX:NewSize设置新生代的初始大小,-XX:MaxNewSize设置新生代的最大值。通常情况下只设置-Xmn即可满足需要。

设置持久代

  1. 持久代(方法区)不属于堆得一部分,使用-XX:MaxPermSize设置持久代最大值,使用-XX:PermSize设置持久代最小值。
  2. 持久代的大小直接决定了系统可以支持多少个类定义和多少常量。
  3. 一般MaxPermSize设置为64M或128M。

取得堆快照(堆dump)

  使用-XX:+HeapDumpOnOutOfMemoryError参数在程序发生OOM时,导出应用程序的当前堆快照。
  通过参数-XX:HeapDumpPath可以指定堆快照的保存位置。
 
 

jvm内存模型及分配参数的更多相关文章

  1. JVM内存模型和关键参数设置

    一. JVM内存模型: Jvm内存模型是学好Java很重要的一部分,该部分学习能让我们在系统运维的时候,或者优化服务器的时候能够有方法,懂原理. 二. Jvm关键参数: 1. 堆大小设置参数: -Xm ...

  2. jvm内存模型及分配

    1.什么是jvm?(1)jvm是一种用于计算设备的规范,它是一个虚构出来的机器,是通过在实际的计算机上仿真模拟各种功能实现的.(2)jvm包含一套字节码指令集,一组寄存器,一个栈,一个垃圾回收堆和一个 ...

  3. jvm内存模型、常见参数及调优

    JVM内存结构: 主要分为:方法区.堆.虚拟机栈.本地方法栈.程序计数器,其中方法区和堆是线程共享的,其他的都是线程隔离的. 方法区: 主要存放类的信息.静态变量.常量.编译后的方法代码,永久代Per ...

  4. JVM内存模型和启动参数的关系

    今天开始接触JVM的内存模型这一块的内容,以下这张图是从网上找的,先收藏了,虽然现在还看不太懂.以后弄懂了才进行详细的解说.

  5. JVM内存模型及配置参数

    JVM 分为堆.栈.方法区.程序计数器.本地方法栈 栈内存存放局部变量表.操作栈.动态链接.方法出口等信息 1.  局部变量表存放了编译期可知的各种基本数据类型(boolean.byte.char.s ...

  6. 记录JVM内存模型,参数含义和优化

    一.JVM内存模型 (图片来自网络) 根据Java虚拟机规范,JVM将内存划分为: New(年轻代) Tenured(年老代) Perm (永久代) 其中New和Tenured属于堆内存,堆内存会从J ...

  7. 直通BAT必考题系列:深入详解JVM内存模型与JVM参数详细配置

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

  8. jvm内存模型和内存分配

    1.什么是jvm? (1)jvm是一种用于计算设备的规范,它是一个虚构出来的机器,是通过在实际的计算机上仿真模拟各种功能实现的. (2)jvm包含一套字节码指令集,一组寄存器,一个栈,一个垃圾回收堆和 ...

  9. JVM内存模型及内存分配过程

    一.JVM内存模型 JVM主要管理两种类型内存:堆(Heap)和非堆(Permanent区域). 1.Heap是运行时数据区域,所有类实例和数组的内存均从此处分配.Heap区分两大块,一块是 Youn ...

随机推荐

  1. 树莓PI上跑爬虫

    主要是进行主机上使用myeclipse开发后,在从机上跑最后的程序 在主机上和树莓上都安装好java环境,maven,ant 拷到RPI上的时候修改

  2. mac usb转串口 连接树莓PI

    USB 转串口是淘宝买的 http://item.taobao.com/item.htm?spm=a1z09.2.9.50.YOJBwG&id=38963495468&_u=4m1dr ...

  3. 取小数点后三位的方法(js)

    使用js取小数点后三位的方法,我觉得这个方法最好 Math.round(num*100)/100 还有其他方法: http://hi.baidu.com/yansueh/item/f026d8d759 ...

  4. 命令ls

    ls -a  显示所有文件,包括隐藏文件(.开头的文件,配置文件常为隐藏文件)ls -l  显示详细信息ls -R  递归显示子目录结构ls -ld  显示目标目录的详细信息(并不返回目录里的内容)

  5. HW6.30

    import java.util.Scanner; public class Solution { public static void main(String[] args) { Scanner i ...

  6. sqlserver 出现 因为文件组 'PRIMARY' 已满 的解决办法 有可能是磁盘剩余空间不足 导致的

    一般虚拟主机提供商是通过限制数据库文件的大小来实现提供定制的数据库空间的.当你把从虚拟数据库空间备份下来的文件恢复到自己的服务器上时,这个限制还是存在的.找到数据库文件 给增加个数据文件就好了 解决办 ...

  7. nyoj 448 寻找最大数

    寻找最大数 时间限制:1000 ms  |  内存限制:65535 KB 难度:2   描述 请在整数 n 中删除m个数字, 使得余下的数字按原次序组成的新数最大, 比如当n=920813467185 ...

  8. hibernate分页实现

    1.创建分页实体类 public class PageBean { private int page; // 页码 private int rows; // 每页显示行数 private int st ...

  9. 让asp.net web api同时支持[AcceptVerbs("GET","POST")]

    在使用第三方接口时,有时候会看到接口同时支持GET和POST,当时想想webapi有AcceptVerbs特性,没有细想便想当然肯定会支持,后来项目中需要用到,当时在没有参数传入下确实支持,直到早几天 ...

  10. c/c++中使用指针需要注意的问题

    一.使用指针的时候需要注意几点: 分配空间 初始化 释放 二.常见的错误有几种: 1)内存分配未成功,却使用了它      编程新手常犯这种错误,因为他们没有意识到内存分配会不成功.常用解决办法是,使 ...