赞
踩
以下为博主整理网络资料而成,如有错误望请指正,感谢!
根据JVM规范,JVM内存共分为虚拟机栈,堆,方法区,程序计数器,本地方法栈五个部分 1. 虚拟机栈 每个线程有一个私有的栈,随线程的创建而创建。 该栈中一种叫“栈帧”的东西,每一个方法会创建一个“栈帧”, 用于存放局部变量表(基本数据类型和对象引用)、操作数栈、方法出口等信息 2. 本地方法栈 该部分与虚拟机用到的Native方法相关,一般情况下,Java程序员不需要关系这部分内容。 3. PC寄存器(程序计数器) JVM支持多个线程同时运行,每个线程都有自己的程序计数器。 若当前执行的是JVM的方法,则PC寄存器保存当前执行指令的地址; 若是本地方法(native方法),则PC寄存器为空。 4. 堆(GC堆) 堆是JVM所有线程共享的部分,在虚拟机启动的时候就已经创建。 所有对象和数组在堆中进行分配。 Java堆不需要连续内存,并且可以通过动态增加其内存。 细分:新生代和老年代; 新生代又分Eden空间、From Survivor空间、To Survivor空间。 5. 方法区 方法区也是所有线程共享。主要用于存储类的信息、常量池、方法数据、方法代码等。 方法区逻辑上属于堆的一部分,但为与堆进行区分,通常又叫“非堆”。
Java把内存分两种:栈内存和堆内存。简单来讲,堆内存用于存放有new创建的对象和数组,在堆中分配的内存,有java虚拟机自动垃圾回收器来管理。而栈内存由使用的人向系统申请,申请人进行管理。
JVM堆内存
JVM堆内存分两个区域:年轻代(YoungGen)、老年代(OldGen)
常用参数
-Xms 堆内存初始大小,单位M、G
-Xmx(MaxHeapSize) 堆内存最大允许大小,一般不要大于物理内存的80%
-XX:PermSize 非堆内存初始大小,一般应用设置初始化200m,最大1024m就够了
-XX:MaxPermSize 非堆内存最大允许大小
-XX:NewSize(-Xns) 年轻代内存初始大小
-XX:MaxNewSize(-Xmn) 年轻代内存最大允许大小,也可以缩写
-XX:SurvivorRatio=8 年轻代中Eden区与Survivor区的容量比例值,默认为8,即8:1
-Xss 堆栈内存大小
JVM非堆内存(方法区)
内存申请过程:
对象的引用四种级别由高到低:强引用、软引用、弱引用、虚引用
1. 栈内存用来存储局部变量和方法调用;
堆内存用来存储Java中的对象,无论是成员变量、局部变量、
还是类变量指向的对象,都存储在堆中。
2 栈内存归属于单个线程,每个线程都有一个栈内存(线程私有);
堆内存对所有线程可见,即堆内存中的对象可以被所有线程访问
3. 栈内存大小远远小于堆内存
4. 栈内存是连续的;堆内存在物理上是不连续的,在逻辑上是连续的
5. 栈是先进后出;堆是先进先出
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。