◆堆(Heap)和非堆(Non-heap)内存
按照官方的说法:“Java虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。堆是在Java虚拟机启动时创建的。”“在JVM中堆之外的内存称为非堆内存(Non-heapmemory)”。可以看出JVM主要管理两种类型的内存:堆和非堆。简单来说堆就是Java代码可及的内存,是留给开发人员使用的;非堆就是JVM留给自己用的,所以方法区、JVM内部处理或优化所需的内存(如JIT编译后的代码缓存)、每个类结构(如运行时常数池、字段和方法数据)以及方法和构造方法的代码都在非堆内存中。
◆堆内存分配
JVM初始分配的内存由-Xms指定,默认是物理内存的1/64;JVM最大分配的内存由-Xmx指定,默认是物理内存的1/4。默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制;空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制。因此服务器一般设置-Xms、-Xmx相等以避免在每次GC后调整堆的大小。
◆非堆内存分配
JVM使用-XX:PermSize设置非堆内存初始值,默认是物理内存的1/64;由XX:MaxPermSize设置最大非堆内存的大小,默认是物理内存的1/4。
◆JVM内存限制(最大值)
首先JVM内存限制于实际的最大物理内存(废话!呵呵),假设物理内存无限大的话,JVM内存的最大值跟操作系统有很大的关系。简单的说就32位处理器虽然可控内存空间有4GB,但是具体的操作系统会给一个限制,这个限制一般是2GB-3GB(一般来说Windows系统下为1.5G-2G,Linux系统下为2G-3G),而64bit以上的处理器就不会有限制了。
Stack(栈)是JVM的内存指令区。Java 基本数据类型,Java 指令代码,常量都保存在Stack中。
Heap(堆)是JVM的内存数据区。在Heap 中分配一定的内存来保存对象实例,实际上也只是保存对象实例的属性值,属性的类型和对象本身的类型标记等。对象实例在Heap 中分配好以后,需要在Stack中保存一个4字节的Heap 内存地址,用来定位该对象实例在Heap 中的位置,便于找到该对象实例。
非静态方法和静态方法的区别:
非静态方法有一个和静态方法很重大的不同:非静态方法有一个隐含的传入参数,该参数是JVM给它的,和我们怎么写代码无关,这个隐含的参数就是对象实例在Stack中的地址指针。因此非静态方法(在Stack中的指令代码)总是可以找到自己的专用数据(在Heap 中的对象属性值)。当然非静态方法也必须获得该隐含参数,因此非静态方法在调用前,必须先new一个对象实例,获得Stack中的地址指针,否则JVM将无法将隐含参数传给非静态方法。
静态方法无此隐含参数,因此也不需要new对象,只要class文件被ClassLoader load进入JVM的Stack,该静态方法即可被调用。当然此时静态方法是存取不到Heap 中的对象属性的。
静态属性保存在Stack指令内存区,动态属性保存在Heap数据内存区。
相关推荐
JVM内存管理是Java虚拟机的核心机制之一,其主要包含对象的创建、内存分配、垃圾回收以及内存释放等过程。在JVM中,垃圾回收(GC)是自动管理内存的关键技术,其目的是回收不再使用的对象所占用的内存空间,以避免...
Java虚拟机(JVM)是Java程序运行的基础,它为Java应用程序提供了运行环境。深入理解JVM内存分配、垃圾收集(Garbage Collection, GC)原理以及垃圾收集器的工作方式对于优化程序性能至关重要。 首先,我们要了解...
【初探JVM内存区域】 Java虚拟机(JVM)是Java编程语言的核心组成部分,它为Java应用程序提供了运行环境。理解JVM内存区域对于优化Java应用性能至关重要。本篇文章将详细探讨JVM中的主要内存区域及其作用。 1. **...
JVM作为Java程序的运行环境,可以在不同的操作系统上加载和执行字节码,这使得Java编写的程序具备了极高的可移植性。这种特性对开发人员来说无疑减轻了重复劳动和调试的负担,也使得软件开发和部署更加高效。 其次...
JVM指令集是Java字节码的具体实现,每一行字节码对应一个或多个JVM指令,这些指令控制着JVM的运行流程。了解JVM指令有助于深入理解Java程序的执行机制,例如内存管理、方法调用、运算操作等。 结合以上信息,我们...
【ASM初探】 ASM是一个Java字节码操控和分析框架,它可以直接生成和修改Java类和.dex文件。这个强大的工具广泛应用于动态代码生成、代理、混淆、性能优化等领域。ASM库的设计目标是小且高效,使得它成为Java字节码...
Java本地接口(Java Native Interface (JNI))允许运行在Java虚拟机(Java Virtual Machine (JVM))上的代码调用本地程序和类库,或者被它们调用,这些程序和类库可以是其它语言编写的,比如C、C++或者汇编语言。...
### 基于游戏开发的Java语言教学初探 #### 教学设想及开发工具 ##### 教学设想 为了提高学生对Java编程的兴趣并增强其实战能力,本教学方案提出了将游戏开发融入到Java语言教学中的想法。通过游戏开发项目,不仅...
Java类加载机制是Java虚拟机(JVM)中的一种机制,负责将类从字节码文件加载到内存中,并将其转换为可执行的类对象。在Java中,类加载机制是通过ClassLoader来完成的,该机制在JDK 1.2以后变得更加复杂和灵活。 类...
JNI是一种规范,它定义了Java虚拟机(JVM)如何与本地代码(如C和C++)交互。通过JNI,Java开发者可以编写混合模式的应用程序,结合Java的跨平台性和本地代码的高效性。 2. **环境准备** - **安装JDK**:首先确保...
这篇博客“初探Druid连接池之三——进入内置监控页面(连接数据源后)”将引导我们深入了解如何在实际应用中启用并使用Druid的监控功能。 首先,Druid连接池的核心优势在于其对数据库连接的精细化管理,包括连接...
本研究中所使用的DeepLearning4J是一个开源的Java深度学习库,它允许Java和JVM语言开发者使用深度学习技术。基于Spark平台上的DeepLearning4J使得开发者可以利用Spark的分布式计算能力来训练和部署大规模的深度学习...
今天我们就来探讨一下在jvm中这些机制是怎样运行的。让我们假设有一个class字节码文件(比如Hello.class文件),那么在应用程序中,他是如何被加载进来,并形成一个类对象的呢?我们这篇文章的目的就是为了解释这个...
它的设计理念是“一次编写,到处运行”,因为Java代码会被编译成字节码,可以在任何支持Java虚拟机(JVM)的平台上运行。 接着,我们来看“投票程序”的概念。在计算机科学中,投票程序通常包含以下功能: 1. 注册...
更重要的是,Java语言编写的应用可以在任何安装了Java虚拟机(JVM)的平台上运行,这使得它成为跨平台开发的理想选择。Java虚拟机的跨平台特性使得Java开发的应用能够在不同的操作系统和硬件环境下无缝迁移和部署,...
### Java编程语言初探 #### 一、Java编程语言简介 Java是一种广泛使用的高级编程语言,以其跨平台性、易学性和广泛的就业前景而著称。它最初由Sun Microsystems(后被Oracle收购)的詹姆斯·高斯林(James Gosling...
《Java Web图书馆课程设计——基于Eclipse、MySQL与Tomcat的初探》 在IT行业中,Java Web技术作为企业级应用的重要开发平台,一直是程序员学习的热点。本课程设计项目"library.zip"就是一个很好的入门实践,它利用...
类加载机制是Java虚拟机(JVM)的重要组成部分。它涉及到类的加载、验证、准备、初始化和卸载过程。理解类加载机制有助于优化程序性能,特别是双亲委派模型、类加载器的层次结构等概念。 3. **JAVA教程 第二讲 ...
《Java开发工具包JDK 1.7.0_55初探》 JDK(Java Development Kit)是Oracle公司发布的用于开发Java应用程序的重要工具集,它包含了编译器、运行环境、调试器以及各种实用工具。在Java编程的世界里,JDK扮演着不可或...