热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

方法住在哪里?堆栈还是堆?-Wheremethodslive?StackorinHeap?

Iknowthatlocalvariablesandparamtersofmethodsliveinstack,butInotabletofigureoutwhe

I know that local variables and paramters of methods live in stack, but I not able to figure out where does actually methods live in case of Java?

我知道局部变量和方法的参数都存在于堆栈中,但我无法弄清楚Java的实际方法在哪里?

If I declare any Thread object like:

如果我声明任何Thread对象,如:

Thread t=new Thread();
t.start();

So it means I've created a separate calling of methods apart from main method. What does it mean? Does it mean calling of separate sequence of methods over Stack memory? Am I right?

所以这意味着我除了main方法之外还创建了一个单独的方法调用。这是什么意思?这是否意味着在堆栈内存上调用单独的方法序列?我对吗?

6 个解决方案

#1


8  

Each thread is allocated its own stack.

每个线程都分配有自己的堆栈。

This article has a good introduction to the memory separation within a Java process.

本文很好地介绍了Java进程中的内存分离。

Inside the Java virtual machine, each thread is awarded a Java stack, which contains data no other thread can access, including the local variables, parameters, and return values of each method the thread has invoked. The data on the stack is limited to primitive types and object references. In the JVM, it is not possible to place the image of an actual object on the stack. All objects reside on the heap.

在Java虚拟机内部,每个线程都被授予一个Java堆栈,其中包含其他线程无法访问的数据,包括线程调用的每个方法的局部变量,参数和返回值。堆栈上的数据仅限于基本类型和对象引用。在JVM中,无法将实际对象的图像放在堆栈上。所有对象都驻留在堆上。

I've seen many scenarios where clients have implemented hugely threaded servers on the basis that each thread does very little, and they run into problems with memory. That's because each thread is allocated its own stack, and this (obviously) adds up. I think the default value is 512k per thread, but I've not found a canonical source for that.

我已经看到很多场景,客户端已经实现了大量线程化的服务器,因为每个线程都做得很少,并且它们会遇到内存问题。那是因为每个线程都分配了自己的堆栈,这显然加起来了。我认为默认值是每个线程512k,但我没有找到一个规范的来源。

#2


8  

If I remember correctly, the method code itself will live in the code portion of memory, while the variables declared internally will live in the stack, and the objects will be created on the heap. In Java, the variable pointers and primitives live on the stack, while any created objects live in the heap.

如果我没记错的话,方法代码本身将存在于内存的代码部分,而内部声明的变量将存在于堆栈中,并且对象将在堆上创建。在Java中,变量指针和基元存在于堆栈中,而任何创建的对象都存在于堆中。

For a (poor) ASCII representation:

对于(差)ASCII表示:

-------
|STACK|
-------
|FREE |
-------
|HEAP |
-------
|CODE |
-------

Where the STACK represents the stack, FREE represents free memory, HEAP represents the heap, and CODE represents the code space.

在STACK表示堆栈的地方,FREE表示空闲内存,HEAP表示堆,CODE表示代码空间。

This is what my memory says - some of the details might be wrong.

这就是我的记忆所说的 - 一些细节可能是错误的。

#3


6  

The stack is comprised of method invocations. What java pushes onto the stack is a method invocation record, which encapsulates all the variables (both parameters and locally instantiated variables) for that method. When you start a Java application, the main method (which automatically includes the args parameter) is the only thing on the stack:

堆栈由方法调用组成。 java推入堆栈的是一个方法调用记录,它封装了该方法的所有变量(包括参数和本地实例化变量)。当您启动Java应用程序时,main方法(自动包含args参数)是堆栈中唯一的东西:

main(args)

When say you create a Foo object and call foo.method(), the stack now looks like:

当你创建一个Foo对象并调用foo.method()时,堆栈现在看起来像:

method()
main(args)

As methods get called, they are pushed onto the stack, and as they return, they are removed or "popped" from the stack. As variables are declared and used the stack entry, which corresponds to the current method (at the top of the stack), grows to include the size of the variable.

当方法被调用时,它们被推入堆栈,当它们返回时,它们被从堆栈中移除或“弹出”。当声明和使用变量时,堆栈条目(对应于当前方法(在堆栈的顶部))增长以包括变量的大小。

For your example with threads, each thread will have its own stack which exists independent of each other thread's stack.

对于带有线程的示例,每个线程都有自己的堆栈,该堆栈独立于彼此的线程堆栈而存在。

#4


1  

The stack contains all the local variables and all active method invocations. The heap hold everything else.

堆栈包含所有局部变量和所有活动方法调用。堆拥有其他一切。

As for your sub question: it means a new stack is created with its own dedicated memory. While your new thread will share the total heap space (memory) allocated by the jvm

至于你的子问题:它意味着用自己的专用内存创建一个新的堆栈。虽然您的新线程将共享由jvm分配的总堆空间(内存)

#5


1  

The heap is split up into multiple generations.

堆被分成多代。

The bytecode, and its corrosponding JIT compiled machine code lives in the so called permanent generation, along with interned Strings and other class data.

字节码及其相应的JIT编译机器代码存在于所谓的永久生成中,以及实习字符串和其他类数据。

Even though it is called the "permanent" generation, it can still be garbage collected. Some libraries, frameworks and JVM languages generate bytecode at run-time, so the permanent generation sometimes need clean up. Just like the other generations of the heap, but (one usually hopes) less frequently.

即使它被称为“永久”一代,它仍然可以被垃圾收集。一些库,框架和JVM语言在运行时生成字节码,因此永久生成有时需要清理。就像堆的其他几代人一样,但(人们通常希望)不那么频繁。

#6


0  

The actual bytecode and/or JIT'd code would live in the process's memory. There would likely only be one copy of it in the process memory, as all threads in a given process share that memory. Any variables shared by those threads will be accessed by the methods in common. Variables local to the threads (even method local variables used within a thread) will be created within that thread's memory.

实际的字节码和/或JIT代码将存在于进程的内存中。在进程内存中可能只有一个副本,因为给定进程中的所有线程共享该内存。这些线程共享的任何变量都将由共同的方法访问。线程的本地变量(即使是线程中使用的方法局部变量)也将在该线程的内存中创建。


推荐阅读
  • IOS Run loop详解
    为什么80%的码农都做不了架构师?转自http:blog.csdn.netztp800201articledetails9240913感谢作者分享Objecti ... [详细]
  • Python 伦理黑客技术:深入探讨后门攻击(第三部分)
    在《Python 伦理黑客技术:深入探讨后门攻击(第三部分)》中,作者详细分析了后门攻击中的Socket问题。由于TCP协议基于流,难以确定消息批次的结束点,这给后门攻击的实现带来了挑战。为了解决这一问题,文章提出了一系列有效的技术方案,包括使用特定的分隔符和长度前缀,以确保数据包的准确传输和解析。这些方法不仅提高了攻击的隐蔽性和可靠性,还为安全研究人员提供了宝贵的参考。 ... [详细]
  • 本文详细介绍了Java反射机制的基本概念、获取Class对象的方法、反射的主要功能及其在实际开发中的应用。通过具体示例,帮助读者更好地理解和使用Java反射。 ... [详细]
  • 本文介绍如何使用OpenCV和线性支持向量机(SVM)模型来开发一个简单的人脸识别系统,特别关注在只有一个用户数据集时的处理方法。 ... [详细]
  • Flutter 2.* 路由管理详解
    本文详细介绍了 Flutter 2.* 中的路由管理机制,包括路由的基本概念、MaterialPageRoute 的使用、Navigator 的操作方法、路由传值、命名路由及其注册、路由钩子等。 ... [详细]
  • Spring – Bean Life Cycle
    Spring – Bean Life Cycle ... [详细]
  • 零拷贝技术是提高I/O性能的重要手段,常用于Java NIO、Netty、Kafka等框架中。本文将详细解析零拷贝技术的原理及其应用。 ... [详细]
  • 在多线程并发环境中,普通变量的操作往往是线程不安全的。本文通过一个简单的例子,展示了如何使用 AtomicInteger 类及其核心的 CAS 无锁算法来保证线程安全。 ... [详细]
  • 如何在Java中使用DButils类
    这期内容当中小编将会给大家带来有关如何在Java中使用DButils类,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。D ... [详细]
  • ### 优化后的摘要本文对 HDU ACM 1073 题目进行了详细解析,该题属于基础字符串处理范畴。通过分析题目要求,我们可以发现这是一道较为简单的题目。代码实现中使用了 C++ 语言,并定义了一个常量 `N` 用于字符串长度的限制。主要操作包括字符串的输入、处理和输出,具体步骤涉及字符数组的初始化和字符串的逆序操作。通过对该题目的深入探讨,读者可以更好地理解字符串处理的基本方法和技巧。 ... [详细]
  • 为了确保iOS应用能够安全地访问网站数据,本文介绍了如何在Nginx服务器上轻松配置CertBot以实现SSL证书的自动化管理。通过这一过程,可以确保应用始终使用HTTPS协议,从而提升数据传输的安全性和可靠性。文章详细阐述了配置步骤和常见问题的解决方法,帮助读者快速上手并成功部署SSL证书。 ... [详细]
  • 在Cisco IOS XR系统中,存在提供服务的服务器和使用这些服务的客户端。本文深入探讨了进程与线程状态转换机制,分析了其在系统性能优化中的关键作用,并提出了改进措施,以提高系统的响应速度和资源利用率。通过详细研究状态转换的各个环节,本文为开发人员和系统管理员提供了实用的指导,旨在提升整体系统效率和稳定性。 ... [详细]
  • 该问题可能由守护进程配置不当引起,例如未识别的JVM选项或内存分配不足。建议检查并调整JVM参数,确保为对象堆预留足够的内存空间(至少1572864KB)。此外,还可以优化应用程序的内存使用,减少不必要的内存消耗。 ... [详细]
  • QT框架中事件循环机制及事件分发类详解
    在QT框架中,QCoreApplication类作为事件循环的核心组件,为应用程序提供了基础的事件处理机制。该类继承自QObject,负责管理和调度各种事件,确保程序能够响应用户操作和其他系统事件。通过事件循环,QCoreApplication实现了高效的事件分发和处理,使得应用程序能够保持流畅的运行状态。此外,QCoreApplication还提供了多种方法和信号槽机制,方便开发者进行事件的定制和扩展。 ... [详细]
  • 本文介绍了如何利用 Delphi 中的 IdTCPServer 和 IdTCPClient 控件实现高效的文件传输。这些控件在默认情况下采用阻塞模式,并且服务器端已经集成了多线程处理,能够支持任意大小的文件传输,无需担心数据包大小的限制。与传统的 ClientSocket 相比,Indy 控件提供了更为简洁和可靠的解决方案,特别适用于开发高性能的网络文件传输应用程序。 ... [详细]
author-avatar
不点包子
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有