粗略分:heap(堆),stack(栈)
jvm的结构细分及其概述
Java 虚拟机有一个堆,堆是运行时数据区域,
所有类实例和数组的内存均从此处分配。
堆是在 Java 虚拟机启动时创建的。”
“在JVM中堆之外的内存称为非堆内存(Non-heap memory)”。
可以看出JVM主要管理两种类型的内存:堆和非堆。
简单来说堆就是Java代码可及的内存,是留给开发人员使用的;
非堆就是JVM留给自己用的。
jvm 内存结构
堆: 逻辑上是连续,物理上可以处于不连续的内存空间中,
里面存储的是对象实例以及数组。可以细分为新生代,老年代。
通过-Xmx和-Xms控制大小。
虚拟机栈:基本数据类型,对象引用(地址,指针)。
本地方法栈(了解):它与虚拟机栈发挥的作用差不多,
区别在于虚拟机栈为java方法的执行提供服务,而本地方法栈为虚拟机使用到的Native(本地)方法服务。
方法区:放了所加载的类的信息(名称、修饰符等)、类中的静态变量、
类中定义为final类型的常量、类中的Field信息、类中的方法信息
在Sun JDK中这块区域对应的为PermanetGeneration,又称为持久代,
默认为64M,可通过-XX:PermSize以及-XX:MaxPermSize来指定其大小
在服务器启动的时候报内存溢出是因为方法区太小,也就相当于持久代的内存太小。
通过-XX:PermSize以及-XX:MaxPermSize来指定其大小,可以解决这个问题。
常量池是方法区的一部分,用来存储常量信息。如String就存储在常量池中。
计数器(了解):通过该计数器的值来选取下一条要执行的字节码指令。