【JVM浅析】大白话解释 JVM五大内存区域 新生代 老年代 永久代和堆的关系?常量池在哪里?本地方法栈是用来干嘛的?

五大内存区域:堆、栈、方法区、本地方法栈、程序计数器

1.堆:用来存放类对象 成员变量的地方,线程共享。
简单来说 例如:new People() 这个对象 就放在堆里面。

2.栈:与堆相对应的,存放局部变量,基本类型变量区,对象引用 ,执行环境上下文;线程不共享。

3.方法区:又叫静态存储区,存放class文件和静态数据,线程共享; 常量池在方法区里面。

4.本地方法栈:和方法区不同!:native方法 即通过JNI (jna.jar包) 调用dll的方法,线程私有,
是一个后入先出栈,本地方法栈会抛出 StackOverflowError 和 OutOfMemoryError 异常。

5.程序计数器(寄存器):虚拟机字节码指令的地址, 所以有的地方会解释为和CPU交互的地方。

堆=新生代New+老年代Tenured,不包括永久代(Perm)(永久代里面就是方法区的东西,可以理解为方法区的一种实现)
Minor GC是发生在新生代中的垃圾收集,采用的复制算法;
老年代中使用Full GC,采用的标记-清除算法;

其中New和Tenured属于堆内存,堆内存会从JVM启动参数(-Xmx:1024)指定的内存中分配,Perm不属于堆内存,有虚拟机直接分配,但可以通过-XX:PermSize -XX:MaxPermSize 等参数调整其大小。

个人理解:Xms,Xmx调堆内存大小;Xss调栈大小,而-XX:PermSize -XX:MaxPermSize调方法区大小

你可能感兴趣的:(java,jvm)