赞
踩
这些知识整理都是自己查阅帅丙资料(当然还有其他渠道)加以总结滴~ 每周都会更新知识进去。
如有不全或错误还请大家在评论中指出~
以Sun HotSpot虚拟机为例。Java内存模型(Java Memory Model ,JMM)就是一种符合内存模型规范的,屏蔽了各种硬件和操作系统的访问差异的,保证了Java程序在各种平台下对内存的访问都能保证效果一致的机制及规范。
其中方法区和堆是所有线程共享的,栈,本地方法栈和程序虚拟机则为线程私有的(编译时确定所需内存大小)。
如果线程执行的是个java方法,那么计数器记录虚拟机字节码指令的地址。如果为native【底层方法】,那么计数器为空。这块内存区域是虚拟机规范中唯一没有OutOfMemoryError
的区域,不需要进行 GC
。
每个方法被执行的时候都会创建一个栈帧
用于存储局部变量表,操作栈,动态链接,方法出口
等信息。每一个方法被调用的过程就对应一个栈帧在虚拟机栈中从入栈到出栈的过程。
两种error:
StackOverflowError
。OutOfMemory
异常。引用变量是普通变量,定义时在栈中分配内存
虚拟机栈执行的是Java方法(也就是字节码)服务,而本地方法栈则为虚拟机使用到的native方法服务。
在HotSopt虚拟机中直接就把本地方法栈和Java栈合二为一。会抛出StackOverflowError+OutOfMemory
栈中主要存放一些基本类型的变量(int, short, long, byte, float, double, boolean, char)和对象句柄。
栈有一个很重要的特殊性,就是存在栈中的数据可以共享。
堆是java虚拟机管理内存最大
的一块内存区域,因为堆存放的对象是线程共享的,所以多线程的时候也需要同步机制。它的目的是存放对象实例。同时它也是GC所管理的主要区域,因此常被称为GC堆,又由于现在收集器常使用分代算法,Java堆中还可以细分为新生代和老年代。
OutOfMemoryError
)为了保证对象的内存分配过程中的线程安全性,HotSpot虚拟机提供了一种叫做TLAB(Thread Local Allocation Buffer)的技术。堆是线程共享的内存区域”这句话并不完全正确,因为TLAB是堆内存的一部分,他在读取上确实是线程共享的,但是在内存分配上,是线程独享的。
堆Heap内存用于存放由new创建的对象和数组。
Java中的对象都是在堆上分配的吗?Java中的对象不一定是在堆上分配的,因为JVM通过逃逸分析,能够分析出一个新对象的使用范围,并以此确定是否要将这个对象分配到堆上。
即时编译判断对象是否逃逸的依据:一种是对象是否被存入堆中(静态字段或者堆中对象的实例字段),另一种就是对象是否被传入未知代码。
并不是所有的对象和数组,都是在堆上进行分配的,由于即时编译的存在,如果JVM发现某些对象没有逃逸出方法,就很有可能被优化成在栈上分配。
用于存储已被虚拟机加载的类信息、常量、静态变量,如static修饰的变量加载类的时候就被加载到方法区中。在JDK1.8中,使用元空间
代替永久代来实现方法区(元空间并不在虚拟机中,而是使用本地内存),元数据空间并不在虚拟机中,而是使用本地内存(不需要进行 GC)
。但会出现OutOfMemoryError
主内存主要包括本地方法区和堆。每个线程都有一个工作内存,工作内存中主要包括两个部分,一个是属于该线程私有的栈和对主存部分变量拷贝的寄存器(包括程序计数器PC和cup工作的高速缓存区)。
1.所有的变量都存储在主内存中(虚拟机内存的一部分),对于所有线程都是共享的。
2.每条线程都有自己的工作内存,工作内存中保存的是主存中某些变量的拷贝,线程对变量的所有操作都必须在工作内存中进行,而不能直接读写主内存中的变量。
3.线程之间无法直接访问对方的工作内存中的变量,线程间变量的传递均需要通过主内存来完成。
-help
-version -showversion
-Xint:解释执行
-Xcomp:第一次使用就编译成本地代码
-Xmixed:混合模式,JVM自己来决定是否编译成本地代码,默认使用的就是混合模式
1、Boolean类型
格式:-XX[+-]<name>其中+-表示启用或者禁用name属性
比如:-XX:+UseConcMarkSweepGC表示启用CMS垃圾收集器,-XX:+UseG1GC表示启用G1垃圾收集器
2、非Boolean类型
格式:-XX:<name>=<value>表示name属性的值是value
比如:-XX:MaxGCPauseMillis=500表示GC的最大停顿时间是500毫秒,-XX:GCTimeRatio=19
注意:-Xmx和-Xms表示设置JVM的最大内存和最小内存,它们不是X参数,而是XX参数,-Xmx等价于-XX:MaxHeapSize,-Xms等价于-XX:InitialHeapSize;-Xss设置堆栈,也是XX参数,等价于-XX:ThreadStackSize
包括以下 7 个阶段:
方法区
的运行时存储结构。符合当前虚拟机的要求
为类静态变量分配内存并设置初始值
,使用的是方法区的内存。初始值一般为 0 值,例如下面的类变量 value 被初始化为 0 而不是 123。
public static int value=123; //在准备阶段 value 初始值为 0 。在初始化阶段才会变为 123 。
但是加上final后就会初始化为123
构造器
。在准备阶段,类变量已经赋过一次系统要求的初始值,而在初始化阶段,通过程序制定的主观计划去初始化类变量和其它资源。• 装载。根据查找路径找到相应的 class 文件,然后导入。
• 链接。链接又可分为 3 个小步:
Bootstrap ClassLoader
)此类加载器负责加载 Java 核心类库,无法被 Java 程序直接引用。
将存放在 <JRE_HOME>\lib 目录中的,或者被 -Xbootclasspath 参数所指定的路径中的,并且是Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。