温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

jvm内存模型及分配参数

发布时间:2020-06-26 13:17:42 来源:网络 阅读:237 作者:刘元兴 栏目:网络安全

jvm内存模型

  1. 程序计数器:是一块很小的内存空间。当线程数量超过cpu数量时,线程之间根据时间片轮询抢夺cpu资源。每一个线程都必须用一个独立的程序计数器,用于记录下一条要运行的指令。

  2. java虚拟机栈(线程栈 ):也是线程私有内存空间,他和java线程在同一时间创建,他保存方法的局部变量、部分结果,并参与方法的调用和返回。如果线程在计算过程中,请求的栈深度大于最大可用的栈深度,则抛出StackOverflowError;如果java栈可以动态扩展,而在扩展的过程中,操作系统没有足够的内存空间来支持栈的扩展,则抛出OutOfMemoryError;——参数设置参见《设置线程栈 》

  3. 本地方法栈:用于管理本地方法的调用,本地方法是使用C实现的。

  4. java堆:堆空间分为新生代和老年代。新生代用于存放产生的新对象,老年代用于存放年长的对象(存在 时间较长,经过垃圾回收次数较多的对象)。新生代又可以细分为eden,s0和s1,eden大部分对象刚建立时,通常放在这里。s0和s1为survivor空间,也就是说存放其中的对象至少经历了一次垃圾回收,并得以幸存。如果幸存区的对象到了指定的年龄仍未被回收,则有机会进入老年代。

  5. 方法区:与堆空间类似,也是被jvm的所有线程共享的,主要保存的是类的类型信息、常量池、域信息、方法信息等元数据。

jvm内存模型及分配参数 

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可以指定堆快照的保存位置。

 


向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI