的。方法区域也被称为"永久世代"和"非堆"。它用于存储虚拟机加载的类信息、常量和静态变量,是每个线程共享的内存区域。默认的最小值是16mb,最大值是64mb。可以用参数-xxf:maxpermsize来限制方法区的大小.运行时常量池:它是方法区的一部分。除了类的版本、字段、方法、接口等描述信息,还有一个常量池,用于存储编译器生成的各种符号引用,在类加载后会放入方法区的运行时常量池。?虚拟机堆栈描述了java方法执行的内存模型:当每个方法被执行时,一个"堆栈框架和用来存储局部变量表(包括参数)、操作栈、方法出口等信息。每个方法都被调用到执行结束,对应一个栈帧在虚拟机栈中从进入栈到退出栈的过程。声明期和线程的声明期一样,是线程私有的。局部变量表存储了编译器已知的各种基本数据类型(boolean,byte,char,short,int,*noat,long,double)和对象引用(引用指针,不是对象本身),其中64位的long和double数据会占用两个局部变量的空间,其余数据类型只占用一个。局部变量表所需的内存空间是在编译过程中分配的。在进入一个方法时,该方法需要在堆栈框架中分配多少个局部变量是完全确定的,在运行时堆栈框架不会改变局部变量表的大小空间。?本地方法栈基本上类似于虚拟机栈,除了虚拟机栈服务于由虚拟机执行的java方法,而本地方法栈服务于native方法。?堆也叫java堆。gc堆是java虚拟机管理的最大内存区域,也是所有线程共享的内存区域。它在jvm启动时创建。这个内存区域存储对象实例和数组(所有新对象)。其大小由参数-xms(最小值)和-xmx(最大值)设置,其中-xms是jvm启动时请求的最小内存,默认为操作系统物理内存的1/64但小于1g,-xmx是jvm可以申请的最大内存,默认为物理内存的1/4但小于1g。默认情况下,当空闲堆内存小于40%时,jvm会将堆增加到-xm。当空闲堆内存大于70%时,jvm会将堆大小减小到-xms指定的大小,这可以通过xx:maxheap实现。用于指定该比较列的注释。对于正在运行的系统,为了避免在运行时频繁调整堆的大小,通常会将-xms和-xmx的值设置为相同。因为现在的收集者采用分代收集算法,所以堆分为新生代和旧时代。新生代主要存储新创建的对象和尚未进入旧时代的对象。旧时代存储了许多新一代gc(次要gc)遗留下来的对象。。新生代:程序新创建的对象都是从新生始分配内存的,新生代由伊甸园空间和两个大小相同的幸存者空间组成(通常称为s0和s1或者from和t)。),新一代的大小可以通过-xmn参数指定,伊甸园空间和幸存者空间的大小也可以通过-xx:survival调整。oldage:用于存储经历了许多代gc的对象,比如缓存对象。新创建的对象也可以直接进入旧时代。主要有两种情况:①。通过设置启动参数-xx:p
学习java虚拟机主要是了解运行时环境的原理,以便后期优化程序或者虚拟机本身的时候用到。
当初我们软件开发完成后,虚拟机本身的默认配置就足够了,不需要太多用户。但是,当我们的软件越来越复杂,用户数量不断上升的时候,我们会发现虚拟机本身会成为一个性能瓶颈。然后我们需要优化虚拟机。怎么优化呢?当然,我们需要知道虚拟机是如何工作的,内存是如何管理的,类是如何加载的等等。然后通过jdks自己的工具或者其他工具来分析我们的软件程序,找到瓶颈,进行有针对性的优化。