jvm中的堆和非堆内存(代码片段)

messpro messpro     2022-12-07     360

关键词:

JVM内存包含以下部分:

  • 堆内存,它是Java对象的存储
  • 非堆内存,Java用于存储加载的类和其他元数据
  • 其他,JVM代码本身,JVM内部结构,加载的探查器代理代码和数据等。

JVM有一个堆,它是运行时数据区,从中分配所有类实例和数组的内存。它是在JVM启动时创建的。

可以使用以下VM选项配置堆大小:

1

2

-Xmx<size> - to set the maximum Java heap size

-Xms<size> - to set the initial Java heap size

默认情况下,最大堆大小为64 Mb。

对象的堆内存由自动内存管理系统回收,该系统称为垃圾收集器。堆可以是固定大小,也可以扩展和缩小,具体取决于垃圾收集器的策略。

非堆

此外,JVM还有堆以外的内存,称为非堆内存。它在JVM启动时创建并存储每类结构,例如运行时常量池,字段和方法数据,方法和构造函数的代码,以及实习字符串。

不幸的是,JVM在非堆内存上提供的唯一信息是它的整体大小。没有关于非堆内存内容的详细信息。

非堆内存大小的异常增长可能表示存在潜在问题,在这种情况下,您可以检查以下内容:

  • 如果存在类加载问题,例如泄漏的加载器。
  • 如果有字符串被大量实施。为了检测这种问题,可以使用对象分配记录。

如果应用程序确实需要大量非堆内存且默认最大大小为64 Mb是不够的,则可以借助-XX:MaxPermSizeVM选项扩大最大大小。例如,-XX:MaxPermSize=128m设置128 Mb的大小。

 

 

 

 

堆栈和堆之间的异同

Similarities and Differences Between Stack and Heap

两者都是Java分配内存的方式,两者都存储在RAM中。但是,为了使事情更容易记住,堆用于动态内存分配,而堆栈用于静态分配。

它存放在哪里? 在堆栈上分配的变量可以直接从内存访问,因此,这些变量可以非常快速地运行。另一方面,访问堆上的对象需要更多时间。

分配何时发生? 在堆栈上,编译程序时会发生内存分配。同时,在堆上,它在程序运行时开始。

既然如此,那么在编译之前,如果要使用堆栈,则需要知道需要多少数据和内存。堆栈的另一个限制是它无法处理需要大量内存的大块变量。如果您不知道在运行时需要多少数据,或者您需要大量数据的内存,那么您需要使用堆。

简而言之…

堆栈stack

  • 堆栈的大小将随着方法和函数根据需要创建和删除局部变量而变化。
  • 分配内存然后随后释放,而无需管理内存分配。
  • 堆栈的大小限制,可能会根据您使用的操作系统而有所不同。
  • 只要创建它们的函数正在运行,就会存在存储在堆栈中的变量。

堆heap

  • 内存不是自动管理的,也不是由管理堆栈的方式由中央处理单元严格管理的。当不再需要这些块时,您需要自己释放已分配的内存。
  • 堆很容易发生内存泄漏,其中内存被分配给未使用的对象,并且除此之外的进程将无法使用。
  • 堆中没有大小限制。
  • 与堆栈相比,堆中的对象访问速度要慢得多。写入堆上的内存也比较慢。

堆栈使用起来更容易,更快,但它带来了很多限制,如果你使用堆,你可以忽略它们。

你什么时候使用堆栈? 堆栈只能用于占用少量内存的局部变量。好消息是内存分配和管理不会成为您的问题,访问这些对象的速度非常快。它确实受到大小限制以及无法在堆栈上调整变量的事实。

你什么时候使用堆?如果存在需要全局访问的变量,则使用堆来分配内存,而不是只对创建它的方法和函数可用。当你需要大量内存时,堆也很好,因为它对内存大小没有限制。您还可以在堆上调整变量的大小。

xmsxmxpermsizemaxpermsize区别

...参数,所以后面的其实都是JVM的参数了-Xms128mJVM初始分配的堆内存-Xmx512mJVM最大允许分配的堆内存,按需分配-XX:PermSize=64MJVM初始分配的非堆内存-XX:MaxPermSize=128MJVM最大允许分配的非堆内存,按需分配我们首先了解一下JVM内存管理... 查看详情

jdk的内存设置

...(Non-heapmemory)”。可以看出JVM主要管理两种类型的内存:堆和非堆。简单来说堆就是Java代码可及的内存,是留给开发人员使用的;非堆就是JVM留给自己用的,所以方法区、JV 查看详情

20210520使用jmap分析虚拟机内存状况(代码片段)

...n-heapmemory)”。可以看出JVM主要管理两种类型的内存:堆和非堆。简单来说堆就是Java代码可及的内存 查看详情

java常见问题分析

...存+堆内存+栈内存+堆外内存JVM主要管理两种类型的内存:堆和非堆。简单来说堆就是Java代码可及的内存,是留给开发人员使用的;非堆就是JVM留给自己用的在JVM中堆之外的内存称为非堆内存(Non-heapmemory)。Jav 查看详情

深入了解jvw

...on-heapmemory)”。可以看出JVM主要管理两种类型的内存:堆和非堆。简单来说堆就是Java代码可及 查看详情

jvm内存溢出及配置

一、JavaJVM内存介绍JVM管理两种类型的内存,堆和非堆。按照官方的说法:“Java虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。堆是在Java虚拟机启动时创建的。”“在JVM中堆之外的内存称为非... 查看详情

值类型和引用类型的区别i数据结构中的堆和栈和内存中的堆和栈的区别(代码片段)

值类型和引用类型的区别I数据结构中的堆和栈和内存中的堆和栈的区别一、值类型和引用类型二、值类型和引用类型的区别三、数据结构中的堆和栈和内存中的堆和栈的区别(一)数据结构中的堆和栈1.栈:装数据的... 查看详情

js中的堆和栈(代码片段)

一.栈和堆栈(stack):栈会自动分配内存空间,会自动释放,存放基本类型,简单的数据段,占据固定大小的空间。(基本类型:String,Number,Boolean,Null,Undefined)堆(heap):动态分配的内存,大小不定也不会自动释放,存放引用... 查看详情

java_opts参数与jvm内存调优

...(Non-heapmemory)”。可以看出JVM主要管理两种类型的内存:堆和非堆。简单来说堆就是J 查看详情

jvm堆内存及非堆内存配置

...参数,所以后面的其实都是JVM的参数了-Xms128mJVM初始分配的堆内存-Xmx512mJVM最大允许分配的堆内存,按需分配-XX:PermSize=64MJVM初始分配的非堆内存-XX:MaxPermSize=128MJVM最大允许分配的非堆内存 查看详情

深入理解java:string

...和数组的内存均从此处分配。JVM主要管理两种类型内存:堆和非堆,堆内存(HeapMemory)是在Java虚拟机启动时创建,非堆内存(Non-heapMemory)是在JVM堆之外的内存。简单来说,非堆包含方法区、JVM内部处理或优化所需的内存(如J 查看详情

jvm内存模型及gc原理

...和数组的内存均从此处分配。JVM主要管理两种类型内存:堆和非堆,堆内存(Heap Memory)是在Java虚拟机启动时创建,非堆内存(Non-heapMemory)是在JVM堆之 查看详情

jvm堆内存和非堆内存(小白入门文,各博客视频基础总结)

...制到老年代),同时对象年龄+1,然后清空Eden和ServivorFrom中的对象。然后ServivorTo和ServivorFrom互换。3.老年代老年代存放生命周期长的内存对象。老年代对象相对稳定,所以不会频繁GC。在进行MajorGC前一般都先进行一次MinorGC,使新... 查看详情

java的堆和栈

  在说堆和栈之前,我们先说一下JVM(虚拟机)内存的划分:     Java程序在运行时都要开辟空间,任何软件在运行时都要在内存中开辟空间,Java虚拟机运行时也是要开辟空间的。JVM运行时在内存中开辟一片... 查看详情

初识jvm,jvm自动内存管理(代码片段)

...OutOfMemoryError2.2.1StackOverflowError2.2.2OutOfMemoryError2.3JVM堆内存和非堆内存2.3.1堆内存和非堆内存2.3.2JVM堆内部构型(新生代和老年代)2.4JVM堆参数设置2.4.1JVM重要参数2.4.2JVM其他参数2.5从日志看JVM三、HotSpotVM3.1HotSpotVM相关知识3.2... 查看详情

内存里的堆和栈只读区静态全局区(代码片段)

...很多初学者的认识,因为我曾经就是这么想的和汇编语言中的堆栈一词混为一谈。我身边的一些编程的朋友以及在网上看帖遇到的朋友中有好多也说不清堆栈,所以我想有必要给大家分享一下我对堆栈的看法,有说的不对的地方... 查看详情

jvm知识

堆(Heap)和非堆(Non-heap)内存 简单来说堆就是Java代码可及的内存,是留给开发人员使用的;非堆就是JVM留给自己用的。堆内存分配    JVM初始分配的内存由-Xms指定,默认是物理内存的1/64;JVM最大分配的内存由-Xmx... 查看详情

javajvm内存介绍与配置

...细介绍。一、JavaJVM内存介绍JVM管理两种类型的内存,堆和非堆。按照官方的说法:“Java虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。堆是在Java虚拟机启动时创建的。”“在J... 查看详情