JVM内存模型及配置参数

JVM 分为堆、栈、方法区、程序计数器、本地方法栈

      栈内存存放局部变量表、操作栈、动态链接、方法出口等信息

     1、  局部变量表存放了编译期可知的各种基本数据类型(boolean、byte、char、short、int、float、long、double)、对象引用(reference 类型,它不等同于对象本身,根据不同的虚拟机实现,它可能是一个指向对象起始地址的引用指针,也可能指向一个代表对象的句柄或者其他与此对象相关的位置)和returnAddress 类型(指向了一条字节码指令的地址)。其中64 位长度的long 和double 类型的数据会占用2 个局部变量空间(Slot),其余的数据类型只占用1 个。局部变量表所需的内存空间在编译期间完成分配,当进入一个方法时,这个方法需要在帧中分配多大的局部变量空间是完全确定的,在方法运行期间不会改变局部变量表的大小、

     2、  在Java 虚拟机规范中,对这个区域规定了两种异常状况:如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError 异常;如果虚拟机栈可以动态扩展

(当前大部分的Java 虚拟机都可动态扩展,只不过Java 虚拟机规范中也允许固定长度的虚拟机栈),当扩展时无法申请到足够的内存时会抛出OutOfMemoryError 异常。

      

3、本地方法栈

本地方法栈(Native Method Stacks)与虚拟机栈所发挥的作用是非常相似的,其区别不过是虚拟机栈为虚拟机执行Java 方法(也就是字节码)服务,而本地方法栈则是为虚拟机使用到的Native 方法服务。虚拟机规范中对本地方法栈中的方法使用的语言、使用方式与数据结构并没有强制规定,因此具体的虚拟机可以自由实现它。甚至有的虚拟机(譬如Sun HotSpot 虚拟机)直接就把本地方法栈和虚拟机栈合二为一。与虚拟机栈一样,本地方法栈区域也会抛出StackOverflowError 和OutOfMemoryError

异常。

4.java堆

java堆是虚拟机管理最大的内存,被所有线程共享的一块内存。java堆分为新生代和老年代 新生代分为 Eden 和 From survivor To survivor空间。

5.方法区和java堆一样。是各个线程共享的内存区域。存放虚拟机加载的类信息、常量、静态变量。类似于永久代。当方法区无法满足内存分配的需求时,将抛出OutOfMemoryError异常

6、永久代 直接内存(堆外内存)

jdk1.4后加入NIO 引入了通道与缓冲区的I/O方式。可以直接操作直接内存

7、jvm配置参数

-Xms 初始堆内存大小

-Xmx 最大堆内存大小

-Xmn 年轻代大小  

-XX:PermSize  永久代

-XX:MaxPermSize 最大永久代

-Xss 每个线程的堆栈大小 栈深

GC配置

-XX:+PrintGC

-XX: +PrintGCDetails

GC性能配置

    1、尽可能分配内存多给虚拟机

    2、初始堆和最大堆大小一样

原文地址:https://www.cnblogs.com/penghaihang/p/7825643.html