这就是我们常说的JVM的内存了。它主要分为五个部分——
1、Heap(堆):一个Java虚拟实例中只存在一个堆空间,存放运行时所有对象和数组。
2、MethodArea(方法区域):被装载的class的信息存储在Methodarea的内存中。当虚拟机装载某个类型时,它使用类装载器定位相应的class文件,然后读入这个class文件内容并把它传输到虚拟机中。
3、JavaStack(java的栈):虚拟机只会直接对Javastack执行两种操作:以帧为单位的压栈或出栈,每次启动一个新的线程,就会被分配一个栈。
4、ProgramCounter(程序计数器):每一个线程都有它自己的PC寄存器,也是该线程启动时创建的。PC寄存器的内容总是指向下一条将被执行指令的饿地址,这里的地址可以是一个本地指针,也可以是在方法区中相对应于该方法起始指令的偏移量。
5、Nativemethodstack(本地方法栈):保存native方法进入区域的地址
以上五部分只有Heap和MethodArea是被所有线程的共享使用的;而Javastack,Programcounter和Nativemethodstack是以线程为粒度的,每个线程独自拥有自己的部分。
新生代,包括eden区和survivor区 默认是8:1采用复制算法,每次将eden区和一块survivor标记之后复制到另一块survivor中,如果不够,会使用担保机制,直接进入年老代
年老代,使用标记整理算法,标记之后,采用内存移动。
jvm配置上如下参数:
-Xmx20M
-Xms20M
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/Users/brady
可以查看内存溢出是,堆信息