加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长百科 > 正文

浅谈虚拟机内存区

发布时间:2019-04-12 03:40:16 所属栏目:站长百科 来源:Wooola
导读:1. Java 假造机内存区概述 我们在编写措施时,常常会碰着OOM(out of Memory)以及内存走漏等题目。为了停止呈现这些题目,我们起首必需对JVM的内存分别有个详细的熟悉。JVM将内存首要分别为:要领区、假造机栈、当处所法栈、堆、措施计数器。 2. Java 假造

本例通过不绝地成立线程的方法发生内存溢出非常。可是,这样发生的内存溢出非常与栈空间是否足够大并不存在任何接洽,可能精确地说,在这种环境下,给每个线程的栈分派的内存越大,反而越轻易发生内存溢出非常。 其缘故起因是操纵体系分派给每个历程的内存是有限定的,如32位的Windows限定为2GB。。

2.3.4 假造机栈的浸染

用于存储局部变量、操纵栈、动态链接、要领出口

2.3.5 假造机栈的运用

对付32位的jvm,默认巨细为256kb, 而64位的jvm, 默认巨细为512kb,可以通过-Xss配置假造机栈的最大值。不外假如配置过大,会影响到可建设的线程数目。

2.3.6 假造机栈的行使场景

2.4. 当处所法栈(Native Method Stack)

2.4.1 当处所法栈的观念

当处所法栈与假造机栈所施展的浸染很相似,他们的区别在于假造机栈为执行Java代码要领处事,而当处所法栈是为Native要领处事。与假造机栈一样,当处所法栈也会抛出StackOverflowError和OutOfMemoryError非常。

2.4.2 当处所法栈的特点

  • 线程私有
  • 为Native要领处事

2.4.3 当处所法栈的非常

与假造机栈一样,当处所法栈也会抛出StackOverflowError和OutOfMemoryError非常。

2.4.4 当处所法栈的浸染

2.4.4.1 与java情形社交互

偶然java应用必要与java表面的情形交互。这是当处所法存在的首要缘故起因,你可以想想java必要与一些底层体系如操纵体系或某些硬件互换信息时的环境。当处所法正是这样一种交换机制:它为我们提供了一个很是简捷的接口,并且我们无需去相识java应用之外的繁琐的细节。

2.4.4.2 与操纵体系交互

JVM支持着java说话自己和运行时库,它是java措施赖以保留的平台,它由一个表明器(表明字节码)和一些毗连到当地代码的库构成。然而不管奈何,它事实不是一个完备的体系,它常常依靠于一些底层(underneath在下面的)体系的支持。这些底层体系经常是强盛的操纵体系。通过行使当处所法,我们得以用java实现了jre的与底层体系的交互,乃至JVM的一些部门就是用C写的,尚有,假如我们要行使一些java说话自己没有提供封装的操纵体系的特征时,我们也必要行使当处所法。

Sun's Java Sun的表明器是用C实现的,这使得它能像一些平凡的C一样与外部交互。jre大部门是用java实现的,它也通过一些当处所法与外界交互。譬喻:类java.lang.Thread

的 setPriority()要领是用java实现的,可是它实现挪用的是该类里的当处所法setPriority0()。这个当处所法是用C实现的,并被植入JVM内部,在Windows 95的平台上,这个当处所法最终将挪用Win32 SetPriority() API。这是一个当处所法的详细实现由JVM直接提供,更多的环境是当处所法由外部的动态链接库(external dynamic link library)提供,然后被JVM挪用。

2.4.5 当处所法栈的运用

2.4.6 当处所法栈的行使场景

  • 与java情形社交互
  • 与操纵体系交互

2.5. Java堆(Heap)

2.5.1 Java 堆的观念

Java堆可以说是假造机中最大一块内存了。它是全部线程所共享的内存地区,险些全部的实例工具都是在这块地区中存放。虽然,跟着JIT编译器的成长,全部工具在堆上分派徐徐变得不那么“绝对”了。

Java堆是垃圾网络器打点的首要地区。因为此刻的网络器根基上回收的都是分代网络算法,全部Java堆可以细分为:新生代和晚年月。在过细分就是把新生代分为:

  • Eden空间
  • From Survivor
  • To Survivor

按照Java 假造机类型的划定:

Java堆可以处于物理上不持续的内存空间中,只要逻辑上是持续的即可,就像我们的磁盘空间一样。在实现时,既可以实现成牢靠巨细的,也可所以可扩展的,不外当前主流的假造机都是凭证可扩展来实现的。

2.5.2 Java 堆的特点

线程间共享地区,在假造机启动时建设

是假造机中最大的一块内存,险些全部的实例工具都是在这块地区中存放

2.5.3 Java 堆的非常

当堆无法再扩展时,会抛出OutOfMemoryError非常。

2.5.4 Java 堆的浸染

独一目标就是存下班具实例,险些全部的工具实例都在java堆平分派内存

2.5.5 Java 堆的运用

通过 -Xmx 和 -Xms 节制

2.5.6 Java 堆的行使场景

2.6. 措施计较器(Program Counter Register)

2.6.1 措施计较器的观念

相同于PC寄存器,措施计数器是线程私有的地区,每个线程都有本身的措施计较器。可以把它当作是当前列程所执行的字节码的行号指示器。

2.6.2 措施计较器的特点

  • 线程私有
  • 占用的内存空间小
  • 此内存地区是独逐一个在Java假造机类型中没有划定任何OOM(OutOfMemoryError)环境的地区

2.6.3 措施计较器的非常

此内存地区是独逐一个在Java假造机类型中没有划定任何OOM(OutOfMemoryError)环境的地区

2.6.4 措施计较器的浸染

  • 信号指示器:多线程间切换时,需规复每一个线程的当前执行位置,通过措施计数器中的值探求要执行的指令的字节码
  • 假如线程在执行Java要领,计数器记录的是正在执行的假造机字节码指令地点;假如执行的是Native要领,计数器的值为空(Undefined)。

2.6.5 措施计较器的运用

通过 -Xmx 和 -Xms 节制

2.6.6 措施计较器的行使场景

2.7. 直接内存

2.7.1 直接内存的观念

2.7.1.1 什么是直接内存与非直接内存?

按照官方文档的描写:

A byte buffer is either direct or non-direct. Given a direct byte buffer, the Java virtual machine will make a best effort to perform native I/O operations directly upon it. That is, it will attempt to avoid copying the buffer's content to (or from) an intermediate buffer before (or after) each invocation of one of the underlying operating system's native I/O operations.

byte byffer可所以两种范例,一种是基于直接内存(也就长短堆内存);另一种长短直接内存(也就是堆内存)。

直接内存(Direct Memory)既不属于假造机运行时数据区的一部门,也不属于Java假造机类型中界说的内存地区,可是这部门内存却被频仍地行使,并且还也许导致OutOfMemoryError非常呈现。

对付直接内存来说,JVM将会在IO操纵上具有更高的机能,由于它直接浸染于当地体系的IO操纵。而堆内存假如要作IO操纵,会先复制到直接内存,再操作当地IO处理赏罚。

从数据流的角度,非直接内存的浸染链:

当地IO-->直接内存-->非直接内存-->直接内存-->当地IO

而直接内存的浸染链:

当地IO-->直接内存-->当地IO

很明明,在做IO处理赏罚时,好比收集发送大量数据时,直接内存会具有更高的服从。

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读