一 JVM内存模型 Java栈 Java栈是与每一个线程关联的JVM在创建每一个线程的时候会分配一定的栈空间给线程它主要用来存储线程执行过程中的局部变量方法的返回值以及方法调用上下文栈空间随着线程的终止而释放StackOverflowError如果在线程执行的过程中栈空间不够用那么JVM就会抛出此异常这种情况一般是死递归造成的 堆 Java中堆是由所有的线程共享的一块内存区域堆用来保存各种JAVA对象比如数组线程对象等 Generation JVM堆一般又可以分为以下三部分 ◆ Perm Perm代主要保存classmethodfiled对象这部门的空间一般不会溢出除非一次性加载了很多的类不过在涉及到热部署的应用服务器的时候有时候会遇到javalangOutOfMemoryError : PermGen space 的错误造成这个错误的很大原因就有可能是每次都重新部署但是重新部署后类的class没有被卸载掉这样就造成了大量的class对象保存在了perm中这种情况下一般重新启动应用服务器可以解决问题 ◆ Tenured Tenured区主要保存生命周期长的对象一般是一些老的对象当一些对象在Young复制转移一定的次数以后对象就会被转移到Tenured区一般如果系统中用了application级别的缓存缓存中的对象往往会被转移到这一区间 ◆ Young Young区被划分为三部分Eden区和两个大小严格相同的Survivor区其中Survivor区间中某一时刻只有其中一个是被使用的另外一个留做垃圾收集时复制对象用在Young区间变满的时候minor GC就会将存活的对象移到空闲的Survivor区间中根据JVM的策略在经过几次垃圾收集后任然存活于Survivor的对象将被移动到Tenured区间 Sizing the Generations JVM提供了相应的参数来对内存大小进行配置正如上面描述JVM中堆被分为了个大的区间同时JVM也提供了一些选项对YoungTenured的大小进行控制 ◆ Total Heap Xms 指定了JVM初始启动以后初始化内存 Xmx指定JVM堆得最大内存在JVM启动以后会分配Xmx参数指定大小的内存给JVM但是不一定全部使用JVM会根据Xms参数来调节真正用于JVM的内存 Xmx Xms之差就是三个Virtual空间的大小 ◆ Young Generation XX:NewRatio=意味着tenured 和 young的比值这样eden+*survivor=/ 堆内存 XX:SurvivorRatio=意味着eden和一个survivor的比值是这样一个Survivor就占Young区的/ Xmn 参数设置了年轻代的大小 ◆ Perm Generation XX:PermSize=M XX:MaxPermSize=M Thread Stack XX:Xss=K 堆栈分离的好处 呵呵其它的先不说了就来说说面向对象的设计吧当然除了面向对象的设计带来的维护性复用性和扩展性方面的好处外我们看看面向对象如何巧妙的利用了堆栈分离如果从JAVA内存模型的角度去理解面向对象的设计我们就会发现对象它完美的表示了堆和栈对象的数据放在堆中而我们编写的那些方法一般都是运行在栈中因此面向对象的设计是一种非常完美的设计方式它完美的统一了数据存储和运行 |