1.大致分为堆,方法区,本地内存。
2.(1)堆是线程共享的,堆里面内存分配(new关键字,反射,垃圾回收等)
堆里面还有方法区,方法区也叫永生区(里面存着常量,静态变量,类变量)运行时常量池 是方法区的一部分,里面存着编辑时期各种字面量和符号。在jdk1.7,常量池移到堆中。在jdk1.8之后,去掉永生区。方法区改为元空间放于本地内存中。
(2)方法区是线程私有的。里面有java栈,本地方法栈,程序计数器。程序记数器是记录行号的,用于多线程切换资源。java栈,每次的生命周期和线程都会创建一个栈帧,用于存贮:局部变量表,操作栈帧,动态链接,方法出口等。方法的执行对应着栈帧在虚拟机的中入栈和出栈过程。本地方法栈保存着native方法的信息。当一个JVM创建线程调用native方法时,jvm将不会创建栈帧,而是简单动态链接并调用native方法。
(3)本地内存里面有直接内存,.主要存贮了JVM运行的程序。用于操作系统调用。(MAXDridectMemerorySize)
3.堆和栈的区别:
栈以栈帧方式存贮方法调用的过程,并存贮方法调用阶段中的基本数据类型的值变量以及对象的引用变量。其内存分配到栈上,变量出来作用域就会自动释放。堆:用来存贮java中的对象,无论成员变量,局部变量,还是类变量,它们指向的对象都存贮在堆内存中。
栈内存属于单个线程,每个线程都会有一个栈内存,其存贮的变量,只能在其所属线程中可见。堆对于所线程可见。堆内存里的对象可以被所有线程访问。
栈的大小(1M)小于堆内存(1G)的大小。如果栈出现死递归很可能会出现stackoverflowerror.可以通过xss设置栈,xms设置堆开始大小,xmx设置堆最大大小。
JVM内存深入解剖
最新推荐文章于 2021-05-26 11:03:49 发布