强烈推荐一个大神的人工智能的教程:http://www.captainai.net/zhanghan
【前言】
最近将Java的内存分析进行了再次学习并进行了总结;Java内存分析一方面对现有系统的优化有着十分重要的指导意义,同时可以让我们以后在进行开发时写出高性能的代码有着重要的借鉴意义。
【内容】
一、代码在内存中一步一步是如何执行的?
在进行内存分析学习的时候,自己脑海首先出现便是这个疑问;通过在网上查找以及参考一些书籍,得到如下步骤:
1、执行总体流程图:
2、执行步骤:
(1)编译代码:用javac将源码文件编译为*.class文件;
(2)类加载:将.class文件加载到JVM,并形成Class对象的机制,方便对Class对象实例化并调用;
(3)执行代码(分为两种):
①解释执行(运行期解释字节码并执行)
A、优点:节省内存
B、缺点:速度慢、效率低
②编译为机器码执行(将字节码编译为机器码并执行,这个编译过程发生在运行期)
A、优点:速度快
B、缺点:占用内存多
二、内存模型
1、五部分:
2、五部分作用:
(1)程序计数器
一个处理器,在一个确定的时刻都只会执行一条线程中的指令,一条线程中有多个指令,为了线程切换可以恢复到正确执行位置,每个线程都需有独立的一个程序计数器,不同线程之间的程序计数器互不影响,独立存储;
(2)虚拟机栈
每个方法被执行的时候都会创建一个栈帧用于存储局部变量表,操作栈,动态链接,方法出口等信息。
每一个方法被调用的过程就对应一个栈帧在虚拟机栈中从入栈到出栈的过程;
①栈帧: 是用来存储数据和部分过程结果的数据结构。
②栈帧的位置: 内存 -> 运行时数据区 -> 某个线程对应的虚拟机栈 -> here[在这里]
③栈帧大小确定时间: 编译期确定,不受运行期数据影响。
(3)本地方法栈
与虚拟机栈发挥的作用十分相似,区别是虚拟机栈执行的是Java方法(也就是字节码)服务,而本地方法栈则为虚拟机使用到的native方法服务,可能底层调用的c或者c++,我们打开jdk安装目录可以看到也有很多用c编写的文件,可能就是native方法所调用的c代码。
(4)堆
java虚拟机管理内存最大的一块内存区域,因为堆存放的对象是线程共享的,所以多线程的时候也需要同步机制
(5)方法区
用于存储已被虚拟机加载的类信息、常量、静态变量,如static修饰的变量加载类的时候就被加载到方法区中
【总结】
本篇文章是内存分析的代码执行流程,以及五大区域的作用,在接下来的文章中会为大家分享更多实用技巧以及如何指导系统进行优化。