详解JVM内存模型使用

开发 后端
本文向大家简单描述一下JVM内存模型,主要包括栈和堆,Java栈是与每一个线程关联的,JVM在创建每一个线程的时候,会分配一定的栈空间给线程,而Java中堆是由所有的线程共享的一块内存区域。

你对JVM内存模型是否熟悉,这里和大家分享一下,主要包括栈和堆两部分内容,Java栈是与每一个线程关联的,JVM在创建每一个线程的时候,会分配一定的栈空间给线程。它主要用来存储线程执行过程中的局部变量,方法的返回值,以及方法调用上下文。Java中堆是由所有的线程共享的一块内存区域,堆用来保存各种JAVA对象,比如数组,线程对象等。

JVM内存模型

  1.1Java栈

  Java栈是与每一个线程关联的,JVM在创建每一个线程的时候,会分配一定的栈空间给线程。它主要用来存储线程执行过程中的局部变量,方法的返回值,以及方法调用上下文。栈空间随着线程的终止而释放。StackOverflowError:如果在线程执行的过程中,栈空间不够用,那么JVM就会抛出此异常,这种情况一般是死递归造成的。

  1.2堆

  Java中堆是由所有的线程共享的一块内存区域,堆用来保存各种JAVA对象,比如数组,线程对象等。

  1.2.1Generation

  JVM内存模型中JVM堆一般又可以分为以下三部分:

  ◆Perm

  Perm代主要保存class,method,filed对象,这部门的空间一般不会溢出,除非一次性加载了很多的类,不过在涉及到热部署的应用服务器的时候,有时候会遇到java.lang.OutOfMemoryError:PermGenspace的错误,造成这个错误的很大原因就有可能是每次都重新部署,但是重新部署后,类的class没有被卸载掉,这样就造成了大量的class对象保存在了perm中,这种情况下,一般重新启动应用服务器可以解决问题。

  ◆Tenured

  Tenured区主要保存生命周期长的对象,一般是一些老的对象,当一些对象在Young复制转移一定的次数以后,对象就会被转移到Tenured区,一般如果系统中用了application级别的缓存,缓存中的对象往往会被转移到这一区间。

  ◆Young

  Young区被划分为三部分,Eden区和两个大小严格相同的Survivor区,其中Survivor区间中,某一时刻只有其中一个是被使用的,另外一个留做垃圾收集时复制对象用,在Young区间变满的时候,minorGC就会将存活的对象移到空闲的Survivor区间中,根据JVM的策略,在经过几次垃圾收集后,任然存活于Survivor的对象将被移动到Tenured区间。

  1.2.2SizingtheGenerations参考资料:

  JVM内存模型中提供了相应的参数来对内存大小进行配置。正如上面描述,JVM中堆被分为了3个大的区间,同时JVM也提供了一些选项对Young,Tenured的大小进行控制。

  ◆TotalHeap

  -Xms:指定了JVM初始启动以后初始化内存

  -Xmx:指定JVM堆得***内存,在JVM启动以后,会分配-Xmx参数指定大小的内存给JVM,但是不一定全部使用,JVM会根据-Xms参数来调节真正用于JVM的内存参考资料:

  -Xmx-Xms之差就是三个Virtual空间的大小

  ◆YoungGeneration

  -XX:NewRatio=8意味着tenured和young的比值8:1,这样eden+2*survivor=1/9

  堆内存

  -XX:SurvivorRatio=32意味着eden和一个survivor的比值是32:1,这样一个Survivor就占Young区的1/34.

  -Xmn参数设置了年轻代的大小

  ◆PermGeneration

  -XX:PermSize=16M-XX:MaxPermSize=64M

  ThreadStack

   -XX:Xss=128K

  1.3堆栈分离的好处

  其它的先不说了,就来说说面向对象的设计吧,当然除了面向对象的设计带来的维护性,复用性和扩展性方面的好处外,我们看看面向对象如何巧妙的利用了堆栈分离。如果从JAVA内存模型的角度去理解面向对象的设计,我们就会发现对象它***的表示了堆和栈,对象的数据放在堆中,而我们编写的那些方法一般都是运行在栈中,因此面向对象的设计是一种非常***的设计方式,它***的统一了数据存储和运行。

【编辑推荐】

  1. JVM内存模型及垃圾收集策略解析
  2. 解决JVM***内存设置问题
  3. 调用weblogic设置jvmheap大小
  4. 详解Tomcat配置JVM参数步骤
  5. 深入学习JVM内存设置原理和调优

 

责任编辑:佚名 来源: hi.baidu.com
相关推荐

2018-11-01 10:34:37

JVM内存配置

2022-02-04 22:05:19

JVM程序内存模型

2010-09-27 13:48:41

JVM内存结构

2023-11-05 12:05:35

JVM内存

2018-07-04 14:43:55

对象模型内存结构内存模型

2010-09-26 13:23:13

JVM内存管理机制

2009-06-24 16:50:11

Java内存模型

2023-06-07 08:08:43

JVM内存模型

2010-12-10 15:40:58

JVM内存管理

2019-05-06 08:37:14

JVMLinux内存

2024-07-26 10:23:52

2010-02-22 08:58:35

JVM内存模型垃圾收集

2010-04-27 09:17:23

内存屏障JVM

2019-09-02 14:53:53

JVM内存布局GC

2023-10-27 07:47:58

Java语言顺序性

2021-09-08 17:42:45

JVM内存模型

2010-09-27 10:01:02

Tomcat5JVM

2017-09-20 08:48:09

JVM内存结构

2009-07-09 15:49:50

JVM内存

2009-06-04 16:27:39

Java虚拟机JVMGC
点赞
收藏

51CTO技术栈公众号