精华内容
下载资源
问答
  • Java虚拟机运行内存区域  JavaVM实现了程序内存的管理,减少了Java程序员内存泄露问题的发生。但是在现实开发中由于对Java虚拟机内存了解的不够容易导致程序内存泄露,所以作为一个Java程序员还是十分有必要了解...

    Java虚拟机运行时内存区域

    JavaVM实现了程序内存的管理,减少了Java程序员内存泄露问题的发生。但是在现实开发中由于对Java虚拟机内存了解的不够容易导致程序内存泄露,所以作为一个Java程序员还是十分有必要了解一些Java虚拟机方面的知识。了解了Java虚拟机的内存管理方面的基本知识,对程序发生内存泄露问题才会有深刻的认识,进而避免初级的错误的发生。

        多线程编程环境下应用程序基本不会只有一个线程在运行,所以JVM针对程序的内存划分会出现线程私有的内存区域和线程共享的内存区域。而在多线程编程环境下,线程共享数据所发生的同步问题一定是发生在线程共享区域的。


    线程私有数据区域

        线程私有数据区域是进程中每个线程所拥有的区域,每个线程拥有自己的数据区域而不会跟其他线程共享这块内存区域。由于并发导致的同步问题一定是由于共享资源引起的,所以线程在访问私有数据区域就不会构成同步问题的充分条件也就不会发生同步问题。同时线程私有数据区域随着线程的创建而创建,随着线程销毁而销毁。

        下面将逐个介绍JVM线程私有的数据区域:

    程序计数器

        程序计数器(PC)与CPU中的程序计数器有些类似。CPU中的程序计数器本质是一个寄存器,用来指示当前进程中执行到的指令地址。而JVM中的程序计数器是一块内存区域并且进程中的每一个线程都有一个自己的程序计数器,JVM的程序计数器用来指示对应线程当前执行的字节码指令地址。总之,CPU的程序计数器不是线程私有的,用来指示当前进程执行的机器指令的地址而JVM的程序计数器是每个线程私有的内存区域,用来指示每个线程当前执行的字节码指令的地址。

                        程序计数器是虚拟机中唯一一个没有规定会OOM的内存区域

    Java虚拟机栈

        Java虚拟机栈用来描述Java方法执行的内存模型,线程调用Java方法时会在虚拟机栈中创建一个虚拟机栈桢。每个栈桢内包含了局部变量表、操作数栈、动态链接和方法出口信息。其中局部变量表大小在编译期间已经确定,存放编译期可知的各种数据类型boolean、byte、char、 short、int、float、long、 double和reference类型。在该内存数据区域可能抛出StackOverflowException和OutOfMemoryError, 具体抛出何种异常则由所使用的JVM来决定。一般情况下在递归调用时,如果退出条件不满足时将会抛出StackOverflowException。

    本地方法栈

        本地方法栈与Java方法栈十分相似,本地方法栈为程序的native代码服务而Java方法栈为Java方法服务。本地方法栈也会抛出StackOverflowException和OutOfMemoryError。


    线程共享的数据区域

        线程共享的数据区域的生命周期比线程私有数据区域的生命周期要长,线程共享的数据区域随进程的创建而创建,随进程销毁而销毁。线程共享数据区域包括堆、方法区和运行时常量池。

    堆(Heap)

        堆是JVM所管理的内存区域中最大的一块,Java堆被进程中所有的线程共享。应用程序内几乎所有的Java对象都存放在Java堆内,也就是说Java堆空间是用来给Java对象分配空间的。Java堆是虚拟机内存回收的主要区域,也是垃圾收集效率最高的区域。由于现在大部分垃圾收集器都是采用分代收集算法,所以Java堆严格上来说还可以继续划分为新生代和老年代等。

        Java堆在进程的逻辑地址空间上是连续的但是在实际物理地址空间中可以是不连续的,可以由内存中不同的地址区块组成。在理论上Java堆可以实现成固定大小,但是主流Java虚拟机一般都实现成可动态改变大小。例如在HotSpot虚拟机中可以通过参数-Xmx和-Xms配置虚拟机Java堆大小的最大值和最小值。在Java堆无法继续为应用程序对象分配内存空间时,虚拟机将会抛出OutOfMemoryException。

    方法区

        虽然在Java虚拟机规范中把方法区列为Java堆的一部分,但是我们一般会将方法区和Java堆区分开来。方法区主要存放虚拟机加载的类信息、常量、静态变量和编译器编译后产生的代码。在习惯上也经常把方法区称为“永久代“,但是这并不意味着数据进入方法区就永久存在于方法区。Java虚拟机也会针对方法区进行内存回收,不过这个区域内存回收的目标主要是常量池和类信息。总得来说,Java虚拟机针对方法区的内存回收效果不会很理想。根据Java虚拟机规范规定,在方法区无法满足内存分配需求时也会抛出OutOfMemoryException。

    运行时常量池

        运行时常量池是方法区的一部分,但是我们经常把它单独拿出来讨论。每个字节码文件包含一项信息是常量池,用于存放编译期生成的各种字面量和符号引用。在类信息加载进虚拟机的时候字节码文件中的常量池将会被加载到运行时常量池。运行时常量池和字节码文件中常量池的一个区别是运行时常量池具备动态性,也就是运行期间可以将新的常量放入池中。

    直接内存

        直接内存分配的大小不受Java堆大小的限制,但是会受到进程可用空间大小的限制。一般应用程序中的native代码通过动态分配方式申请的空间都分配在直接内存,Java类库NIO中也有部分类会在直接内存中申请空间。在直接内存无法为应用程序分配空间时也会抛出OutOfMemoryException。

    展开全文
  • java虚拟机运行内存分配

    千次阅读 2017-08-21 08:47:00
    JAVA虚拟机运行时区图解 程序计数器(PC寄存器):可以看做当前线程的字节码的行号指示器,根据指示器显示的值来执行吓一条字节码指令,每一条Java虚拟机线程都有自己的pc寄存器,任意时刻java虚拟机只会执行一个方法...

    JAVA虚拟机运行时区图解

    JAVA虚拟机运行时区

    1. 程序计数器(PC寄存器):可以看做当前线程的字节码的行号指示器,根据指示器显示的值来执行吓一条字节码指令,每一条Java虚拟机线程都有自己的pc寄存器,任意时刻java虚拟机只会执行一个方法的代码,如果是native的寄存器的值为undefined(未定义),不是native方法寄存器的值为正在执行的虚拟机字节码指令的地址的地址
    2. 每一条Java虚拟机线程都有自己的pc寄存器,任意时刻java虚拟机只会执行一个方法的代码,若该方法不是native的pc寄存器保存正在执行的字节码指令地址,如果是native的pc寄存器的值为undefined(未定义)
    3. JAVA虚拟机栈:JAVA虚拟机栈是线程私有的,他和生命周期和线程相同,JAVA虚拟机栈是虚拟机描述JAVA方法的内存模型,每个方法执行时会创建一个栈帧,栈帧用于存储局部变量,操作数栈,动态链接,方法出口等信息。每一个方法从调用执行到执行对应着帧栈从入栈到出栈的过程。
    4. 局部变量表:局部变量表属于java虚拟机栈的组成部分,用于存放各种编译期可知的数据类型,long和double占2个局部变量空间,其他数据类型(boolean,byte,char,short,int,float,reference,returnaddress)占用一个局部变量空间。
    5. 本地方法栈:本地方法栈与JAVA虚拟机栈的区别是,他是执行费java方法的服务。java虚拟机实现过程中可能用到传统的C栈(C Stack)来支持native方法(用其他语言编写的方法),这个栈就是本地方法栈。HotSpot虚拟机直接把本地方法栈和JAVA虚拟机栈和二为一。
    6. JAVA堆:堆提供一个可以供个个线程共享的内存区域,java虚拟机堆在虚拟机启动时就被创建了,几乎所有对象的分配都要在堆上分配,堆是垃圾回收期管理的主要区域,堆可以建立在物理上不连续的存储空间中,内存可扩展。
    7. 方法区:方法区是堆的逻辑组成部分,用于存储一倍虚拟机加载的类信息,常量,静态变量,既时编译编译后的代码等数据部分虚拟机对此区域不进行垃圾回收。
    8. 运行常量池:运行常量池是方法区的一部分,用于存储编译期生成的各种字面量和符号引用。(某各类被加载时会检查常量池中时候定位到类的符号引用,若没有则先加载到运行常量池)
    9. 直接内存:直接内出不是运行时内存分配部分,也不是JAVA虚拟机规范所定义的范围,在JDK1.4后引入NIO类库,有Buffer的IO方式,使原来在JAVA堆和Native堆相互转化的操作改编为JAVA虚拟机某个对象直接对内存进行引用
    展开全文
  • java 虚拟机运行内存分布分析 虚拟机所管理的内存如下图: 首先,虚拟机管理内存分为线程共享和线程隔离两大类,线程共享的有方法区和堆;线程隔离数据区有 虚拟机栈、本地方法区和程序计数器。 方法区:这里记录...

    java 虚拟机运行时内存分布分析

    • 虚拟机所管理的内存如下图:

    这里写图片描述

    首先,虚拟机管理内存分为线程共享和线程隔离两大类,线程共享的有方法区和堆;线程隔离数据区有 虚拟机栈、本地方法区和程序计数器。

    • 方法区:这里记录运行时所需的规范类东西,比如类的描述信息,常量,静态变量,即时编译器编译后的代码数据等。这里基本上是不变的,有的虚拟机是用GC分代收集机制来统一管理这里,然后分代的时候分给这里为“永久代”(但这不是一个好方式,更容易内存溢出,所以已经想改变这一策略,1.7hotspot中已经将原本放在这里的字符串常量池移出)。这里存放信息,以供其他地方使用,比如一个对象分配内存后,当真正使用这个对象的时候,需要找到它对应的是哪个类,然后才能知道这个对象里的字节都怎么读取,分别表示什么,否则这个对象里的数据都只是数据而已,这些都是需要对应一个类,这些数据就存在方法区里。这里的内存回收,主要针对常量池和类型卸载。

    • 堆:这里存放对象信息,是java虚拟机所管理的内存中最大的一块。所有的对象和数组都在堆上分配(当然,随着技术的发展,栈上分配,标量替换会导致一些变化,使得这一结论不那么绝对)。堆可以是固定大小的也可以是可扩展的。

    • 虚拟机栈,即通常所说的堆栈中的栈,它是线程私有的,生命周期跟线程相同。这里管理方法执行模型,每一个方法执行时形成一个栈帧,用于存储方法执行所需的局部变量、操作数栈、动态链接、方法出口等。执行完后,栈帧出栈。一个栈帧生成时,它的大小是确定的,在运行时是不会改变局部变量表的大小的。

    • 本地方法栈:这里为本地方法服务,效果跟虚拟机栈一样,hotspot是把这两个区合并使用的。

    • 程序计数器:执行字节码的指针,指向哪个字节码指令,就执行那个指令。如果执行native方法,这里指向空。

    以上就是java虚拟机内存管理的一些东西。来自《深入理解java虚拟机:JVM高级特性与最。。》一书。

    展开全文
  • 首先,Java的运行内存包括:虚拟机栈、本地方法栈、堆、方法区和直接内存。-Xms:表示设置堆的最小容量;-Xmx:表示设置堆的最大容量。由于在HotSpot虚拟机中并不区分虚拟机栈和本地方法栈,因此,对于HotSpot来说...
    • 首先,Java的运行时内存包括:虚拟机栈、本地方法栈、堆、方法区和直接内存。
    • -Xms:表示设置堆的最小容量;-Xmx:表示设置堆的最大容量。
    • 由于在HotSpot虚拟机中并不区分虚拟机栈和本地方法栈,因此,对于HotSpot来说,虽然-Xoss参数(设置本地方法栈大小)存在,但实际上是无效的,栈容量只由-Xss参数设定。
    • 可以通过-XXPermSize-XXMaxPermSize限制方法区大小。
    • 直接内存容量可通过-XXMaxDirectMemorySize指定,如果不指定,则默认与Java堆最大值(-Xmx指定)一样 。


    展开全文
  • Java虚拟机在执行Java程序的过程中会将其管理的内存划分为若干个不同...Java虚拟机所管理的内存包括以下几个运行时数据区域,如图(图片引自网络): 1.1 程序计数器(Program Counter Register)
  • JVM:图文详解Java虚拟机内存结构

    万次阅读 多人点赞 2019-09-29 07:33:11
    本文将全面讲解Java虚拟机中的内存模型 & 分区,希望你们会喜欢
  • Java虚拟机内存管理

    千次阅读 2017-09-19 08:45:21
    虚拟机内存模型在jdk1.8之后有了一些变化,我们分开来看,请看下图: 由图我们可以看出,jdk每个版本都会有新生代和老年代,唯一不同的是小于1.8的版本为永久代,而大于等于1.8的版本去掉了永久代,转为元...
  • public class RuntimeUtils { ... * 获取系统运行时信息 */ public static void getSystemOperationInformation() { //获取当前程序运行时 Runtime runtime = Runtime.getRuntime(); //打印处理...
  • Java虚拟机在执行Java程序的过程中,会把它所管理的内存划分为若干个不同的数据区,这些区域都有自己各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进行的启动而存在,有些区域则依赖用户线程的启动和结束而...
  • java虚拟机运行时的内存分配
  • 概述C/C++开发人员在内存管理方面最有最高统治权。很NB,也很累。内存声明维护释放都靠自己。一不小心内存垃圾就会...虚拟机运行时数据区域根据《Java虚拟机规范(Java SE 7版)》Java管理的内存将会分为以下几个内存
  • java虚拟机运行时数据区域广义上可以分为程序计数器 堆 栈和直接内存。 程序计数器(线程私有) 可以看作当前线程所执行的字节码的行号指示器。众所周知,多线程是争抢CPU执行时间的,轮流切换并分配cpu时间,每...
  • Java虚拟机-内存划分==================================  在Java中,在虚拟机自动内存机制管理的帮助下,不需要程序员为每一个new操作去写对应的delete/free代码,不容易出现内存泄漏和内存溢出的错误,这一切由...
  • 虚拟机内存回收

    千次阅读 2017-05-12 11:01:52
    一、Java虚拟机运行内存示意图: 1、程序计数器: 每条线程都有一个独立的程序计数器, 一块较小内存区域,指向当前所执行的字节码。如果线程正在执行一个Java方法,这个计数器记录正在执行的虚拟机字节码...
  • **JVM自动内存管理机制** java内存区域与内存溢出异常 概述 : 对于从事C/C++程序...对于java程序员来说,在虚拟机自动内存管理机制的帮助下,不在需要为每一个new操作去写配对的delete/free代码,不容易出现内存泄漏
  • 修改jboss运行时java虚拟机内存大小

    千次阅读 2010-08-03 17:27:00
    如果一个应用程序为了提高性能而把数据加载内存中而占用较大的内存,比如超过了默认的最大值128MB,需要加大java虚拟机可使用的最大内存,否则会出现Out of Memory(系统... <br />修改jboss运行时java虚拟
  • 什么是虚拟机?什么是 Java 虚拟机? ...进程虚拟机:进程虚拟机并不会完整的模拟一个操作系统的运行环境,而仅仅提供特定指令集的运行环境。Java 虚拟机就属于进程虚拟机。除了 JVM 之外,还有 A
  • Java虚拟机内存区域

    千次阅读 2019-07-04 21:38:18
    前言 JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范...Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),...
  • jvm内存分布图 ... 虚拟机栈:用于存储局部变量,是线程独有,局部变量是在编译的时候已经确认后,方法运行时候的栈是已经确认好的。虚拟机栈规定了2种异常情况,一种是线程请求栈的深度大于虚拟...
  • 提及到Java进程在运行的时候内存使用情况,是很多初学者比较迷惑的地方,也就是我们在运行编译好的.class文件时...查看JVM虚拟机可以向当前所在宿主的操作系统"可以"申请到的最大内存;如果程序运行时设置了-Xmx参数那
  • java虚拟机内存模型

    千次阅读 2018-08-18 10:59:48
    1. 概述 对于从事 C、C++ 程序开发的...但是对于 java 程序员来说,在虚拟机自动内存管理机制的帮助下,不需要再为每一个 new 操作写配对的 delete/free 代码,不容易出现在内存泄漏和内存溢出问题,由虚拟机管理内...
  • virtualBox更改虚拟机内存大小

    千次阅读 2018-11-02 09:19:00
    在cmd中进入到virtualbox安装目录 查看目前的虚拟机列表: 1 VBoxManage list vms  读取虚拟机具体信息 ... 修改参数 [首先要关闭虚拟机再执行命令] 1 VBoxManage.exe modifyvm [name] --memory...
  • Java虚拟机运行时数据区

    万次阅读 2019-12-13 14:55:00
    Java虚拟机运行时数据区是我们深入了解JVM的必经之路,那这是什么样的一个区域呢?Java虚拟机在执行Java程序的过程中,会把它所管理的内存划分若干个不同的数据区域,这些区域被赋予不同的用途,它们有着各自创建和...
  • VMware虚拟机优化,提高虚拟机运行速度的方法?

    万次阅读 多人点赞 2019-05-23 11:35:50
    这几天开始开发项目发现当打开虚拟机并运行,开启虚拟机后台中的微服务电脑运行非常卡慢,还有开启微服务进程时,当运行内存不足时会直接将微服务进程顶掉。 下面是虚拟机优化的方法,提高虚拟机工作的速度,优化...
  • 对于 Java 的开发者来说,在虚拟机的自动内存管理机制的帮助下,不再需要为每一个 new 操作去写配对的 delete/ free 代码,这样不容易出现内存泄露和内存溢出的问题,只要全权交给虚拟机去处理。不过,也正是因为...
  • 虚拟机内存设置

    千次阅读 多人点赞 2018-11-15 11:55:39
    首先说明一点,虚拟机内存配置取决于主机内存虚拟机运行程序需要的内存。虚拟机内存肯定是要小于主机内存的,但很显然,他也不是越小越好,否则虚拟机上的程序根本运行不起来,就会出现进程被killed的情况。 ...
  • vmware虚拟机运行卡慢的解决办法

    万次阅读 多人点赞 2018-07-12 21:54:20
    虚拟机的运行速度有一部分原因决定于你的物理机的配置,如果你的物理机配置不高,建议不要运行虚拟机,那样反而会更卡...以下几张图,可以让你的虚拟机运行的非常畅快,请按照图片上的指示,认真操作: ...
  • IDEA修改虚拟机内存

    千次阅读 2017-12-19 09:23:33
    -vmargs表示以下为虚拟机设置参数,可修改其中的参数值,也可添加-Xmn,-Xss,另外,eclipse.ini内还可以设置非堆内存,如:-XX:PermSize=56m,-XX:MaxPermSize=128m。 此处设置的参数值可以通过以下配置在开发...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 355,742
精华内容 142,296
关键字:

如何修改虚拟机的运行内存