通过这几天对一个内存溢出程序的监控,学习了程序运行时对内存的使用机制,在这里和大家分享下。
Java程序运行在JVM(Java Virtual Machine,Java虚拟机)上,可以把JVM理解成Java程序和操作系统之间的桥梁,JVM实现了Java的平台无关性,由此可见JVM的重要性。所以在学习Java内存分配原理的时候一定要牢记这一切都是在JVM中进行的,JVM是内存分配原理的基础与前提。
一个完整的Java程序运行过程会涉及以下内存区域:
寄存器:JVM内部虚拟寄存器,存取速度非常快,程序不可控制。
栈:保存局部变量的值,包括:a.用来保存基本数据类型的值;b.保存类的实例,即堆区对象的引用(指针)。也可以用来保存加载方法时的帧。
堆:用来存放动态产生的数据,比如new出来的对象。注意创建出来的对象只包含属于各自的成员变量,并不包括成员方法。因为同一个类的对象拥有各自的成员变量,存储在各自的堆中,但是他们共享该类的方法,并不是每创建一个对象就把成员方法复制一次。
常量池:JVM为每个已加载的类型维护一个常量池,常量池就是这个类型用到的常量的一个有序集合。包括直接常量(基本类型,String)和对其他类型、方法、字段的符号引用(1)。池中的数据和数组一样通过索引访问。由于常量池包含了一个类型所有的对其他类型、方法、字段的符号引用,所以常量池在Java的动态链接中起了核心作用。常量池存在于堆中。
代码段:用来存放从硬盘上读取的源程序代码。
数据段:用来存放static定义的静态成员。
下图表示内存分配图:
对于java 和内存之间,有如下几点需要注意:
1.一个Java文件,只要有main入口方法,我们就认为这是一个Java程序,可以单独编译运行。
2.无论是普通类型的变量还是引用类型的变量(俗称实例),都可以作为局部变量,他们都可以出现在栈中。只不过普通类型的变量在栈中直接保存它所对应的值,而引用类型的变量保存的是一个指向堆区的指针,通过这个指针,就可以找到这个实例在堆区对应的对象。因此,普通类型变量只在栈区占用一块内存,而引用类型变量要在栈区和堆区各占一块内存。
3.分清什么是实例什么是对象。Class a= new Class();此时a叫实例,而不能说a是对象。实例在栈中,对象在堆中,操作实例实际上是通过实例的指针间接操作对象。多个实例可以指向同一个对象。
4.栈中的数据和堆中的数据销毁并不是同步的。方法一旦结束,栈中的局部变量立即销毁,但是堆中对象不一定销毁。因为可能有其他变量也指向了这个对象,直到栈中没有变量指向堆中的对象时,它才销毁,而且还不是马上销毁,要等垃圾回收扫描时才可以被销毁。
5.以上的栈、堆、代码段、数据段等等都是相对于应用程序而言的。每一个应用程序都对应唯一的一个JVM实例,每一个JVM实例都有自己的内存区域,互不影响。并且这些内存区域是所有线程共享的。这里提到的栈和堆都是整体上的概念,这些堆栈还可以细分。
6 .类的成员变量在不同对象中各不相同,都有自己的存储空间(成员变量在堆中的对象中)。而类的方法却是该类的所有对象共享的,只有一套,对象使用方法的时候方法才被压入栈,方法不使用则不占用内存。
分享到:
相关推荐
and Java 第 24 章,SQL,PL/SQL,及 Java <br>Chapter 25, Overview of Application Development Languages 第 25 章,应用程序开发语言概述 <br>Chapter 26, Native Datatypes 第 26 章,原生数据类型 <br>Chapter...
Ehcache 是一个开源的 Java 缓存库,它提供了本地内存缓存以及分布式缓存解决方案。在 Spring 框架中,Ehcache 可以被轻松地集成,以提升应用的性能,减少数据库的负载。这篇博客将深入探讨如何将 Ehcache 集成到 ...
1.Configuration.xml 是 mybatis 用来建立 sessionFactory 用的,里面主要包含了数据库连接相关东西,还有 java 类所对应的别名,比如 <typeAlias alias="User" type="com.yihaomen.mybatis.model.User"/> 这个别名...
10. **垃圾回收(Garbage Collection)**:Java的自动内存管理机制,通过垃圾回收器回收不再使用的对象占用的内存。理解GC的工作原理和性能优化策略,能有效防止内存泄漏。 11. **Java虚拟机(JVM)**:理解JVM的...
1 <dependency>2 <groupId>org.springframework.session</groupId>3 <artifactId>spring-session-data-redis</artifactId>4 <version>1.1.1.RELEASE</version>5 <type>pom</type>6 </dependency> 随后我们在...
- **异常处理**:有效管理错误,如IP格式不正确、端口号超出范围等,确保系统稳定运行。 #### 二、系统设计概览 **2.1 总体设计** - **前后台分离**:后台负责核心的端口扫描逻辑,而前台专注于用户交互与结果...
在IT行业中,Java Development Kit(JDK)是Java编程的...通过阅读《JDK常用命令详解.doc》和《jdk-bin下的命令详解---转载,学习下.txt》,你可以更深入地学习每个命令的用法和具体示例,从而提升你的Java开发技能。
管理员登录,员工管理,部门管理,岗位管理,职称管理,工龄奖金管理,工资项管理,考勤管理,工资查询,统计图表等功能。 员工角色包含以下功能: 员工登录,个人信息管理,考勤管理,工资详情等功能。 环境需要 1.运行环境:...
- 当不再需要这些资源时,应及时释放,避免内存泄漏。 - 使用诸如`try-with-resources`语句来自动关闭资源。 **3.2 异常处理** - 在处理异常时,应当优先使用`try-catch-finally`结构。 - `finally`块用于执行必要...
19. JVM:涵盖Java虚拟机的内存模型、垃圾回收机制、类加载机制、性能调优等高级概念。 除了上述模块,文章还强调了对于面试题的深入解析和代码案例的提供,这对于面试者理解知识点、整理思路和表达能力的培养是至...
标题 "Spring + Quartz配置实例(转载)" 暗示了我们将讨论如何在Java环境中整合Spring框架与Quartz作业调度库的使用。Quartz是一个开源的作业调度库,它允许开发者安排任务以在特定时间执行,而Spring框架则是一个...
4. 性能优化技巧:这可能包括代码优化、内存管理和垃圾收集策略等。在Java 9中,引入了G1垃圾收集器的并行全垃圾收集,这有助于减少停顿时间并提高应用程序的性能。 5. Java性能基准测试:书中可能会讨论如何衡量和...
Java提供了Thread类和Runnable接口来创建和管理线程。在这个案例中,可能会有一个线程负责用户界面的更新,另一个线程负责抽奖逻辑,确保抽奖过程不会阻塞UI的响应。 3. **流(Stream)**:Java的I/O流系统用于读取...
不同的Java虚拟机(JVM)有不同的内存管理策略。以Sun的JVM为例,它将内存划分为年轻代、老年代和永久代。年轻代包括EDEN和两个幸存者空间,对象在EDEN出生,经过多次垃圾收集后,存活的对象会被移到老年代。如果一...
- **内存管理**:理解堆栈内存分配,垃圾回收机制(GC)及其原理。 - **异常处理**:熟悉try-catch-finally结构,异常类型和异常链。 2. **集合框架** - **ArrayList和LinkedList**:它们的实现方式、性能特点及...
更低版本的JDK6、JDK7可能需要设置Java内存-XX:PermSize=128M -XX:MaxPermSize=512M,否则可能出现这种类型的内存溢出:java.lang.OutOfMemoryError: PermGen space。 Servlet2.5或更高版本(如Tomcat6或更高版本)。...
3. **配置 Tomcat**:编辑 Tomcat 的 server.xml 文件,修改或添加 `<Manager>` 元素,指定 Memcached Session Manager。例如: ```xml <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager...
数组的内存有两种分配方式:静态数组在声明时指定大小,内存由系统自动管理;动态数组在运行时申请,用完后需要归还。Java中的数组都是动态的,元素可以是基本类型或引用类型。 多维数组,尤其是二维数组,是常见的...
4. **内存管理**:JNA负责内存管理,避免了JNI中的内存泄漏问题。 **JNI详解** 相比之下,JNI是Java平台标准的一部分,提供了与本地代码交互的底层接口。虽然它提供了更灵活的控制,但学习曲线较陡峭,因为开发者...
虚拟机层负责内存管理、垃圾收集、线程调度等低级操作,而运行时系统则包含类加载、对象创建、反射等高级功能。 2. **动态编译与解释器** Hotspot采用了一种称为"混合模式"的执行策略,即在程序启动时使用解释器...