|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
你总不能说你写框架吧,那无疑会加大工作量,现在大多企业采取的是折中的办法,就是改别人写好的框架,可要改框架,前提是你对这个框架足够的了解,这就更难了。了解JVM运转时的数据区是Java编程中的进阶部分。我们在开辟中都碰到过一个很头疼的成绩就是OutOfMemoryError(内存溢堕落误),可是假如我们懂得JVM的外部完成和其运转时的数据区的事情机制,那末后面的成绩就会水到渠成。在这片文章中,我们将复杂懂得JVM中有哪些运转时数据区和这些数据区的事情机制。
JVM运转时数据辨别类
- 程序计数器(ProgramCounter(PC)Register)
- JVM栈(JavaVirtualMachineStacks)
- 堆内存(HeapMemory)
- 办法区(MethodArea)
- 运转经常量池(Run-timeConstantPool)
- 当地办法栈(NativeMethodStacks)
有图才干说
按线程持有分别
检察下面的图,能够得知以上六个数据区实在线程公有仍是共享,能够分为以下两种。
- 单个线程公有(ManagedPer-Thread)属于这一种的数据区包括程序计数器,JVM栈另有当地办法栈。每一个线程都公有这三个数据区,这些数据区在其所属的线程创立时初始化,并跟着所属线程停止被烧毁。
- 多个线程共享属于这一种的数据区包括堆内存,办法区和运转经常量池。这些数据区能够被每个线程会见,他们跟着JVM启动而初始化,同时陪伴JVM封闭而烧毁。
程序计数器
在通用的盘算机系统中,程序计数器用来纪录以后正在实行的指令,在JVM中也是云云。程序计数器是线程公有,以是当一个新的线程创立时,程序计数器也会创立。因为Java是撑持多线程,Java中的程序计数器用来纪录以后线程中正在实行的指令。假如以后正在实行的办法是当地办法,那末现在程序计数器的值为undefined。注重这个地区是独一一个不抛出OutOfMemoryError的运转时数据区。
JVM栈
在先容JVM栈之前,复杂先容一个观点,栈帧
栈帧
一个栈帧跟着一个办法的挪用入手下手而创立,这个办法挪用完成而烧毁。栈帧内寄存者办法中的部分变量,操纵数栈等数据。
JVM栈只对栈帧举行存储,压栈和出栈操纵。栈内存的巨细能够有两种设置,流动值和依据线程必要静态增加。在JVM栈这个数据区大概会产生抛出两种毛病。
- StackOverflowError呈现在栈内存设置成流动值的时分,当程序实行必要的栈内存凌驾设定的流动值会抛出这个毛病。
- OutOfMemoryError呈现在栈内存设置成静态增加的时分,当JVM实验请求的内存巨细凌驾了其可用内存时会抛出这个毛病。
堆数据区
堆数据区是用来寄存对象和数组(特别的对象)。堆内存由多个线程共享。堆内存跟着JVM启动而创立。尽人皆知,Java中有一个很好的特征就是主动渣滓接纳。渣滓接纳就操纵这个数据区往返收对象进而开释内存。假如堆内存残剩的内存不敷以满意于对象创立,JVM会抛出OutOfMemoryError毛病。
办法区
在JVM标准中,办法区被视为堆内存的一个逻辑部分。这一点大概因为详细的JVM完成而分歧,乃至在办法区不完成渣滓接纳处置也是能够的。办法区和堆内存一样被多个线程会见,办法区中寄存类的信息,好比类加载器援用,属性,办法代码和机关办法和常量等。当办法区的可用内存没法满意内存分派需求时,JVM会抛出OutOfMemoryError毛病。
ruby里有这些工具吗?又要简单多少?我没有用过这两门语言,我估计在这些语言力没有很统一的这种标准,或者根本就没有提供。 |
|