当前位置: 首页 > 知识库问答 >
问题:

JVM中的堆栈/堆

吕树
2023-03-14

我来自C/C++背景,在这里一个进程内存分为:

    null

我想把我的注意力集中在这一点上,当我阅读JVM中的堆和堆栈时,我们是在谈论堆栈和堆的概念吗?并且整个JVM的实际内存驻留在堆上(这里指的是堆的C++概念)?

共有1个答案

欧阳骏俊
2023-03-14

我想把我的注意力集中在这一点上,当我阅读JVM中的堆和堆栈时,我们是在谈论堆栈和堆的概念吗?

是的,一般情况是这样的。每个线程都有自己的每线程堆栈,用于在堆栈帧中存储局部变量(对应于方法调用)。堆栈不需要位于与OS级别的每线程堆栈相关的位置。如果堆栈试图增长超过-xss指定的大小或实现设置的默认值,则将引发StackOverflowError

堆栈可以存在于C/C++堆内存中,并且不必是连续的(JVM规范v7):

通过简单地调用构造函数(例如HashMap foo=new HashMap()),JVM将在堆上为该对象分配必需的内存(如果不可能,则抛出OutOfMemoryError)。还需要注意的是,对象从来不存在于堆栈中--只有对它们的引用才存在。此外,非基元字段也总是包含对对象的引用。

还可以通过sun.misc.unsafe在一些JVM上、一些分配直接缓冲区的NIO类上以及通过使用JNI来离堆分配内存。这个内存不是JVM堆的一部分,也不进行自动垃圾回收(这意味着它需要通过delete等方式释放,但它可能是堆内存的一部分,因为C++可能会引用它。

 类似资料:
  • 问题内容: 每当加载一个类时,什么存储在堆中以及什么存储在堆栈中? 线程也驻留在哪里? 问题答案: 引用类型在堆中。 任何原始类型的数据和对堆上值(方法的参数/局部变量)的引用都在堆栈上。 每个线程都有自己的堆栈。 应用程序中的所有线程共享同一堆。

  • 我们Java开发人员有时会使用来确保我们为每个特定于线程的堆栈提供了1MB的空间。现在,我经常感到困惑,JVM从哪里借用了1MB,从堆或系统内存中借用,或者Java为线程分配任何特定的内存。你能帮我理解一下吗? 此外,我们是否有一个可视化(插件)运行时工具,可以以可理解的方式显示堆和堆栈的内容? 提前感谢。

  • JVM规范表明JVM堆栈可以是固定大小的,也可以是动态扩展的。 -Xss JVM选项允许设置固定大小,如果我没有设置这个选项是设置默认值(大约512-2048k),但是如何告诉JVM在需要时动态分配它的堆栈呢? 如果我不能设置动态大小选项,那么设置一个大的Xss值(比如说20M)实际上会为JVM中的每个线程分配20MB内存吗?还是动态分配的内存会被限制在20MB?

  • 本文向大家介绍Java虚拟机JVM堆栈区,包括了Java虚拟机JVM堆栈区的使用技巧和注意事项,需要的朋友参考一下 以下是了解JVM堆栈区域的一些关键点- 在创建线程期间,Java虚拟机将创建一个单独的堆栈。 JVM在此堆栈上仅执行两个操作。操作是推入(即插入)和弹出(即删除)。 当前正在执行线程时,与其关联的堆栈称为运行时堆栈。 线程完成的每个方法调用,中间计算,局部变量的分配,调用参数等都作为

  • 问题内容: JVM运行时数据区为每个正在执行的方法提供单独的堆栈。它包含操作数堆栈和局部变量。每次加载变量时,都需要先到操作数堆栈,然后再到局部变量。为什么不直接操作局部变量表,并进行一些看似重复的工作? 问题答案: 具有直接操作数的指令集必须对每个指令中的操作数进行编码。相反,对于使用操作数堆栈的指令集,操作数是隐式的。 当查看小的琐碎运算(例如将常量加载到变量中)时,隐式参数的优势并不明显。本

  • JVM规范(JSE 8版)提到: 第12页:2.5.2 JVM堆栈:“因为JVM堆栈除了用于推送和弹出帧之外,从来没有被直接操作过,所以帧可以被堆分配。” 第15页:2.6:帧:“帧是从创建帧的线程的JVM堆栈中分配的。”在第16页:“请注意,由线程创建的框架是该线程的本地框架,不能被任何其他线程引用。” 这听起来让我很困惑。既然一个帧是创建该帧的线程本地的,为什么要在堆中分配该帧,因为堆在所有J