要了解内存分配机制,首先要有如下几个概念:

1、程序计数器      当前单线程执行程序的字节码行号,相当于执行步骤编号  

2、java虚拟机栈    线程私有,生命周期与线程相同,用于存储局部变量表、操作栈、动态链接、方法出口等信息
3、本地方法栈      与java虚拟机栈功能相同,为虚拟机使用的本地方法服务
4、java堆         多线程共享区域,主要用来存对象实例,Java 堆是垃圾收集器管理的主要区域,因此很多时候也被称做“GC 堆”
5、方法区   用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据,例如对象类型,静态图片等
6、运行时常量池     方法区的一部分,用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载后存放到方法区的运行时常量池中

7、直接内存        在JDK 1.4 中新加入了NIO(New Input/Output)类,引入了一种基于通道(Channel)与缓冲区(Buffer)的I/O 方式,它可以使用Native 函数库直接分配堆外内存,然后通过一个存储在Java 堆里面的DirectByteBuffer 对象作为这块内存的引用进行操作。这样能在一些场景中显著提高性能,因为避免了在Java 堆和Native 堆中来回复制数据


如图:


jvm基础(1)




从上边可以看程序计数器,java虚拟机栈,本地方法栈 都是线程私有的,这里也可以叫私有内存区


而方法区,java堆是公有的,这里也可以叫做共享内存区




jvm 堆内存无疑是分配内存最多的一块儿,Java 堆的大小为20MB,不可扩展(将堆的最小值-Xms 参数与最大值-Xmx 参数设置为一样即可避免堆自动扩展)
-Xms -Xmx 分别设置堆内存的最大最小值
-XX:PermSize=64M JVM初始分配的非堆内存

-XX:MaxPermSize JVM最大允许分配的非堆内存,按需分配


备注:以上只是一些基本概念,但是真正的web服务项目里对于jvm的调优还讲究许多,包括像我们现在项目的大数据服务,对外提供访问的时候,jvm的调优也至关重要,如何控制hbase等组件高并发下的jvm调优,还需要很多,后续会跟进

相关文章: