
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
Java虚拟机的学习与应用是每一位Java编程开发程序员都应该熟练掌握的一个互联网编程开发技术,而本文我们就通过案例分析来了解一下,Java虚拟机内存区域都有哪些。
1、程序计数器(ProgramCounterRegister)
记录当前线程所执行的字节码的行号。
依赖其实现分支、循环、跳转、异常处理、线程恢复。
Natvie方法时,其的值就为空。
Java虚拟机规范中没有规定内存溢出的区域。
“线程私有”的内存区域。
2、虚拟机栈(VirtualMachineStacks)
其生命周期与线程相同。
存储局部变量表、操作数栈、动态链接、方法出口等信息。
方法被执行的时候创建一个栈帧并入栈。
方法执行完成的时候对应栈帧出栈。
栈的深度过大时,抛出StackOverflowError。
线程数过多时,抛出OutOfMemoryError。
“线程私有”的内存区域。
3、本地方法栈(NativeMethodStacks)
为虚拟机使用到的Native方法服务。
栈的深度过大时,抛出StackOverflowError。
线程数过多时,抛出OutOfMemoryError。
“线程私有”的内存区域。
4、堆(JavaHeap)
用于存放对象实例,是JVM占用内存大一块区域。
垃圾收集器管理的主要区域。
使用分代收集算法时,堆被细分为新生代和老年代,新生代再细分为Eden空间、FromSurvivor空间、ToSurvivor空间。
在HotSpot虚拟机中,通过-Xmx和-Xms控制堆的大小,通过-Xmn控制新生代的大小。
堆可以处于物理上不连续的内存空间中,只要逻辑上是连续的即可。
没有内存完成实例分配时,抛出OutOfMemoryError。
“线程共享”的内存区域,线程共享的堆中又可能划分出多个线程私有的分配缓存区(ThreadLocalAllocationBuffer,TLAB)。
5、方法区(MethodArea)
存储已被JVM加载的类信息、常量、静态变量、即时编译器编译后的代码。
回收目标主要是针对常量池的回收和对类型的卸载。
可以选择不实现垃圾收集。
当方法区无法满足内存分配需求时,将抛出OutOfMemoryError。
JDK6使用永久代实现方法区。
JDK7中永久代的字符串常量池被移出。
JDK8使用元空间实现方法区。
“线程共享”的内存区域。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请加danei0707学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。