2019年理解JVM如何使用Windows和Linux上的本机.doc
《2019年理解JVM如何使用Windows和Linux上的本机.doc》由会员分享,可在线阅读,更多相关《2019年理解JVM如何使用Windows和Linux上的本机.doc(8页珍藏版)》请在三一文库上搜索。
1、理解JVM如何使用Windows和Linux上的本机摘要:Java堆耗尽并不是造成java.lang.OutOfMemoryError的惟一原因。如果本机内存耗尽,则会发生普通调试技巧无法解决的OutOfMemoryError。本文将讨论本机内存的概念,Java运行时如何使用它,它被耗尽时会出现什么情况,以及如何在Windows和Linux上调试本机OutOfMemoryError。Java堆(每个Java对象在其中分配)是您在编写Java应用程序时使用最频繁的内存区域。JVM设计用于将我们与主机的特性隔离,所以将内存当作堆来考虑再正常不过了。您一定遇到过Java堆OutOfMemoryErr
2、or,它可能是由于对象泄漏造成的,也可能是因为堆的大小不足以存储所有数据,您也可能了解这些场景的一些调试技巧。但是随着您的Java应用程序处理越来越多的数据和越来越多的并发负载,您可能就会遇到无法使用常规技巧进行修复的OutOfMemoryError.在一些场景中,即使java堆未满,也会抛出错误。当这类场景发生时,您需要理解Java运行时环境(Java Runtime Environment,JRE)内部到底发生了什么。Java应用程序在Java运行时的虚拟化环境中运行,但是运行时本身是使用C之类的语言编写的本机程序,它也会耗用本机资源,包括本机内存。本机内存是可用于运行时进程的内存,它与J
3、ava应用程序使用的java堆内存不同。每种虚拟化资源(包括Java堆和Java线程)都必须存储在本机内存中,虚拟机在运行时使用的数据也是如此。这意味着主机的硬件和操作系统施加在本机内存上的限制会影响到Java应用程序的性能。本机内存简介我将首先解释一下操作系统和底层硬件给本机内存带来的限制。如果您熟悉使用C等语言管理动态内存,那么您可以直接跳到下一节。硬件限制本机进程遇到的许多限制都是由硬件造成的,而与操作系统没有关系。每台计算机都有一个处理器和一些随机存取存储器(RAM),后者也称为物理内存。处理器将数据流解释为要执行的指令,它拥有一个或多个处理单元,用于执行整数和浮点运算以及更高级的计算
4、。处理器具有许多寄存器-常快速的内存元素,用作被执行的计算的工作存储,寄存器大小决定了一次计算可使用的最大数值。处理器通过内存总线连接到物理内存。物理地址(处理器用于索引物理RAM的地址)的大小限制了可以寻址的内存。例如,一个16位物理地址可以寻址0x0000到0xFFFF的内存地址,这个地址范围包括216=65536个惟一的内存位置。如果每个地址引用一个存储字节,那么一个16位物理地址将允许处理器寻址64KB内存。处理器被描述为特定数量的数据位。这通常指的是寄存器大小,但是也存在例外,比如32位390指的是物理地址大小。对于桌面和服务器平台,这个数字为31、32或64;对于嵌入式设备和微处理
5、器,这个数字可能小至4.物理地址大小可以与寄存器带宽一样大,也可以比它大或小。如果在适当的操作系统上运行,大部分64位处理器可以运行32位程序。表1列出了一些流行的Linux和Windows架构,以及它们的寄存器和物理地址大小:表1.一些流行处理器架构的寄存器和物理地址大小架构寄存器带宽(位)物理地址大小(位)(现代)Intel x86 32 32 36,具有物理地址扩展(Pentium Pro和更高型号)x86 64 64目前为48位(以后将会增大)PPC64 64在POWER 5上为50位390 31位32 31 390 64位64 64操作系统和虚拟内存如果您编写无需操作系统,直接在处理
6、器上运行的应用程序,您可以使用处理器可以寻址的所有内存(假设连接到了足够的物理RAM)。但是要使用多任务和硬件抽象等特性,几乎所有人都会使用某种类型的操作系统来运行他们的程序。在Windows和Linux等多任务操作系统中,有多个程序在使用系统资源。需要为每个程序分配物理内存区域来在其中运行。可以设计这样一个操作系统:每个程序直接使用物理内存,并且可以可靠地仅使用分配给它的内存。一些嵌入式操作系统以这种方式工作,但是这在包含多个未经过集中测试的应用程序的环境中是不切实际的,因为任何程序都可能破坏其他程序或者操作系统本身的内存。虚拟内存允许多个进程共享物理内存,而且不会破坏彼此的数据。在具有虚拟
7、内存的操作系统(比如Windows、Linux和许多其他操作系统)中,每个程序都拥有自己的虚拟地址空间-一个逻辑地址区域,其大小由该系统上的地址大小规定(所以,桌面和服务器平台的虚拟地址空间为31、32或64位)。进程的虚拟地址空间中的区域可被映射到物理内存、文件或任何其他可寻址存储。当数据未使用时,操作系统可以在物理内存与一个交换区域(Windows上的页面文件或者Linux上的交换分区)之间移动它,以实现对物理内存的最佳利用率。当一个程序尝试使用虚拟地址访问内存时,操作系统连同片上硬件会将该虚拟地址映射到物理位置,这个位置可以是物理RAM、一个文件或页面文件/交换分区。如果一个内存区域被移
8、动到交换空间,那么它将在被使用之前加载回物理内存中。图1展示了虚拟内存如何将进程地址空间区域映射到共享资源:图1.虚拟内存将进程地址空间映射到物理资源程序的每个实例以进程的形式运行。在Linux和Windows上,进程是一个由受操作系统控制的资源(比如文件和套接字信息)、一个典型的虚拟地址空间(在某些架构上不止一个)和至少一个执行线程构成的集合。虚拟地址空间大小可能比处理器的物理地址大小更小。32位Intel x86最初拥有的32位物理地址仅允许处理器寻址4GB存储空间。后来,添加了一种称为物理地址扩展(Physical Address Extension,PAE)的特性,将物理地址大小扩大到
9、了36位,允许安装或寻址至多64GB RAM.PAE允许操作系统将32位的4GB虚拟地址空间映射到一个较大的物理地址范围,但是它不允许每个进程拥有64GB虚拟地址空间。这意味着如果您将大于4GB的内存放入32位Intel服务器中,您将无法将所有内存直接映射到一个单一进程中。地址窗口扩展(Address Windowing Extension)特性允许Windows进程将其32位地址空间的一部分作为滑动窗口映射到较大的内存区域中。Linux使用类似的技术将内存区域映射到虚拟地址空间中。这意味着尽管您无法直接引用大于4GB的内存,但您仍然可以使用较大的内存区域。内核空间和用户空间尽管每个进程都有其
10、自己的地址空间,但程序通常无法使用所有这些空间。地址空间被划分为用户空间和内核空间。内核是主要的操作系统程序,包含用于连接计算机硬件、调度程序以及提供联网和虚拟内存等服务的逻辑。作为计算机启动序列的一部分,操作系统内核运行并初始化硬件。一旦内核配置了硬件及其自己的内部状态,第一个用户空间进程就会启动。如果用户程序需要来自操作系统的服务,它可以执行一种称为系统调用的操作与内核程序交互,内核程序然后执行该请求。系统调用通常是读取和写入文件、联网和启动新进程等操作所必需的。当执行系统调用时,内核需要访问其自己的内存和调用进程的内存。因为正在执行当前线程的处理器被配置为使用地址空间映射来为当前进程映射
11、虚拟地址,所以大部分操作系统将每个进程地址空间的一部分映射到一个通用的内核内存区域。被映射来供内核使用的地址空间部分称为内核空间,其余部分称为用户空间,可供用户应用程序使用。内核空间和用户空间之间的平衡关系因操作系统的不同而不同,甚至在运行于不同硬件架构之上的同一操作系统的各个实例间也有所不同。这种平衡通常是可配置的,可进行调整来为用户应用程序或内核提供更多空间。缩减内核区域可能导致一些问题,比如能够同时登录的用户数量限制或能够运行的进程数量限制。更小的用户空间意味着应用程序编程人员只能使用更少的内存空间。默认情况下,32位Windows拥有2GB用户空间和2GB内核空间。在一些Windows
12、版本上,通过向启动配置添加/3GB开关并使用/LARGEADDRESSAWARE开关重新链接应用程序,可以将这种平衡调整为3GB用户空间和1GB内核空间。在32位Linux上,默认设置为3GB用户空间和1GB内核空间。一些Linux分发版提供了一个hugemem内核,支持4GB用户空间。为了实现这种配置,将进行系统调用时使用的地址空间分配给内核。通过这种方式增加用户空间会减慢系统调用,因为每次进行系统调用时,操作系统必须在地址空间之间复制数据并重置进程地址-空间映射。图2展示了32位Windows的地址-空间布局:图2.32位Windows的地址-空间布局图3显示了32位Linux的地址-空间
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2019 理解 JVM 如何 使用 Windows Linux
链接地址:https://www.31doc.com/p-2491491.html