Java语言与c语言有一个非常重要的区别就是:内存管理方式的不同,java语言内存管理不需要程序开发人员关注,而c语言的内存的请求和释放都是开发人员来处理。辩证的思维来看,不同内存管理实现方式有优点和缺点,所以语言应用的场景,效率会有很大不同。
Jvm运行时的数据区域主要有:程序计数器、虚拟机栈、本地方法栈、方法区和堆。其中程序计数器、虚拟机栈和本地方法栈是线程独享,而方法区和堆是所有线程共享。
ü 程序计数器:jvm每个线程都有一个程序计数器。在任一时刻都有一个线程的方法在运行,如果这个方法不是本地方法,那么程序计数器存放的就是正在执行的指令地址;如果是本地方法,那么程序计数器中存放的指定地址为undefined。
ü 虚拟机栈:当jvm创建一个线程的时候就会为线程分配一个虚拟机栈。主要用于存放方法的一些本地变量和部分结果,一般这里的大小都是固定,但不是绝对。一个方法的执行到完成就是栈的入栈和出栈。假设在某方法中定义了一个对象Object obj=new Object();其中obj是存放在栈上,而new Object()是在堆上分配。-Xss可以控制jvm虚拟机栈的大小。
ü 本地方法栈:大体跟虚拟机栈类似,不过是给本地方法使用的。虚拟机栈和本地方法栈在hotspot是没有分开实现的,而是统称为栈。
ü 方法区:主要存放静态变量,常量,类加载器加载的类等一些信息。
ü 堆:jvm绝大部分的对象分配都在堆上分配。-Xmn –Xmx是控制堆最小值和最大值,一般堆的大小在使用了超过mx设定的70%的时候,就会自动扩大到最大值,所以防止这种扩大和缩小我们设置成一样的值。