`
中国爪哇程序员
  • 浏览: 167244 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

java 内存管理

    博客分类:
  • java
阅读更多
对JVM的一次系统整理.有些东西的描述并不严谨,或者在不同平台和不同版本上关同一点的内容会用很大出入。这里不再细分。只是对JVM 有清楚认识。

1 Java虚拟机的种类

1.1  Oracle Java虚拟机
原Sun Java虚拟机
原BEA JRockit
两种Java虚拟机,都运行在Windows、Linux、Solaris平台
1.2  HP Java虚拟机:
与SUN JDK基本兼容,有自己独特的启动参数
运行在HP UNIX上
1.3  IBM Java虚拟机:
与Sun JDK基本兼容
启动参数的写法风格与Sun JDK、HP JDK非常不同
主要用于WebSphere、跑在AIX上的中间件服务器
1.4  开源 Java虚拟机:
与SUN JDK兼容 

2 选择合适的Java虚拟机
2.1  选择稳定的JDK:
刚刚GA的版本不稳定,比如1.5.0_00 1.6.0_00
刚增加新特性的版本不稳定,比如1.5.0_07  1.6.0_14
安装JDK之前,先看厂商的Release Notes
2.2 根据平台和应用,选择合适厂商的JDK:
HP-UX只能选择HP JDK,AIX只能选择IBM JDK
Windows、Linux可以选择SUN JDK和JRockit
Solaris平台,最好使用SUN JDK
开源JDK,目前生产环境中用的极少

3 JVM内存在哪
3.1 JVM内存在哪
操作系统把内存分成两块。一个是KernelSpace ,另一块 UserSapce
KernelSpace指的是 操作系统保留内存,即供操作系统使用的内存。
UserSapce  指的是供OS使用之外的内存。像我们平时用的应用程序包括JVM都是跑在UserSapce。
不同操作系统下KernelSpace 和 UserSapce 大小和比例是不一样的。

3.2 内存
内存 = Java 内存 + 本地内存+ 加载的可执行文件和库 + 操作系统保留内存

3.3 java 内存
分为Java 堆内存(heap)和Permanent区(Sun/Hp JDK,只针对这个版本)
Java 堆内存(heap):
是 JVM 用于分配 Java 对象的内存,包含活动对象 和不可用对象
堆大小通常是在服务器启动时使用 java 命令中的 –Xms(最小) –Xmx(最大)标志来定义。
Permanent区:
是Sun JDK和HP JDK用来加载类(class)的专门的内存区
这个区域不归属Java 堆内存(heap)范围
如果Java应用很大,例如类(class)很多,那么建议增大这个区域的大小来满足加载这些类的内存需求
通过–XX:PermSize=***M –XX:MaxPermSize=***M调整

Java 内存 主要指的就是堆。即存放对象的堆内存。当然也包括持久区的概念,有人会叫他方法区,其实class中的声名的方法也有部分内容存放在codecache里(一块内存区域),准确来产方法区是一个实现方式,即开辟出一块内存来存放方法。但不同的JVM版本在这会有不同的实现,可能在以后升级中会去掉方法区这种实现,把方法放到堆中统一进行管理。
而我们常说的GC,其实管理的内存就是上面提到的java heap和方法区。网上有人提到方法区内是不能被GC,其实是可以的。可见Java HotSpot(TM)官方网站。

3.4 native heap
本地内存:
是 JVM 用于其内部操作的本地内存(非Java内存)
JNI 代码和第三方本地模块(例如,本地 JDBC 驱动 程序)也使用本地内存
最大本地内存大小取决于以下因素:
操作系统进程内存大小限制
已经指定用于 Java 堆的内存

这里简单介绍下JNI:
JNI是Java Native Interface的缩写,中文为JAVA本地调用。从Java1.1开始,Java Native Interface(JNI)标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是 C和C++而设计的,但是它并不妨碍你使用其他语言,只要调用约定受支持就可以了。

3.5 native
Native Method就是java调用非java代码的接口。

4.内存不足时 出现一些情况
4.1 GC次数过多,导致占用时间过长
GC占用时间过长--系统明显感觉比较慢
Heap区、Perm区分配内存总量够用
通过verbose gc、jstat观察,GC占用时间超过总时间的5%甚至更高
4.2 内存不足错误
内存不足错误--明确显示出java.lang.OutOfMemoryError
没有空闲内存可供 JVM 或本地代码用于分配新对象或内存块
在 Java 堆或本地内存中都可能发生
4.3 内存泄漏错误--没有错误信息,但是内存几乎耗尽
已经分配好的内存或对象,当不再需要,没有得到释放
内存曲线是一条斜向上的曲线
对 Java 堆或本地内存都可能产生这个问题
通常最终的状态就会导致 OOM 错误


上面的红色的部分指的就是加载的可执行文件和库 + 操作系统保留内存
Java内存和其他一些应用程序所使用的内存都是蓝色部分。
Java内存又可细分为java heap,指的是堆 和持久区方法区。
native heap,用于其内部操作的本地内存(非Java内存)JNI 代码(优化代码载入)
    和第三方本地模块(例如,本地 JDBC 驱动程序)使用主要取决于JVM代码生成,
最大本地内存大小取决于以下因素:
操作系统进程内存大小限制
已经指定用于 Java 堆的内存
“加载的可执行文件和库+系统保留内存”不同操作系统和应用不一样
计算机的物理内存  = RAM + 交换空间 ,进程的虚拟内存由 OS 映射到物理内存

3.4 内存不足时,出现的一些情况:
3.4.1 Heap区、Perm区分配内存总量够用
通过verbose gc、jstat观察,GC占用时间超过总时间的5%甚至更高
3.4.2内存不足错误
java.lang.OutOfMemoryError
没有空闲内存可供 JVM 或本地代码用于分配新对象或内存块
在 Java 堆或本地内存中都可能发生
ava内存--包括heap堆内存和permanent区
本地内存--包括JVM进程内存和java使用的第三方本地代码
同样这类OOM产生的问题也是分成正常使用耗尽和无释放资源耗尽两类
无释放资源耗尽很多时候不是程序员自身的原因,可能是引用的 第三方包的缺陷,例如很多人遇到的Oracle 9 JDBC驱动在低版本中有内存泄露的问题
另一种情况就是正常消耗Native Heap Memory,对于Native Heap Memory的使用主要取决于JVM代码生成,线程创建,用于优化的临时代码和对象产生
3.4.3内存泄漏错误
已经分配好的内存或对象,当不再需要,没有得到释放
内存曲线是一条斜向上的曲线
对 Java 堆或本地内存都可能产生这个问题
通常最终的状态就会导致 OOM 错误

5 classloader
http://luyuanliang.iteye.com/admin/blogs/1077782

6 GC
1.gc对象
2.gc算法
3.gc收集器
 
分享到:
评论

相关推荐

    java内存管理详细介绍.doc

    Java内存管理是Java编程中至关重要的一环,它与C++等其他语言的内存管理机制有着显著的区别。在C++中,程序员需要手动管理内存,包括分配和释放,而在Java中,这一过程则由Java虚拟机(JVM)自动进行,通过垃圾收集...

    Java内存管理机制相关资料汇总

    资源名称:Java内存管理机制相关资料汇总资源目录:【】java内存回收机制及预防【】java内存管理机制【】java内存管理白皮书【】Java虚拟机内存管理_对象和引用_空指针【】深入理解java虚拟机jvm高级行与最佳实践...

    java内存管理

    Java内存管理是Java编程中的核心概念,它涉及到程序运行时如何高效地分配、使用和回收内存。在Java中,内存管理主要由JVM(Java Virtual Machine)负责,其中包括了垃圾收集机制,确保程序不会因为内存泄漏而导致...

    java内存管理 ppt

    Java内存管理是Java编程中的核心概念,它涉及到程序运行时数据的存储、分配以及回收。在Java中,内存主要分为堆内存(Heap)和栈内存(Stack),还有方法区(Method Area)、程序计数器(PC Register)以及本地方法...

    java内存管理精彩概述

    Java内存管理是Java核心技术的重要组成部分,对于每个开发者来说,理解其工作原理都是十分必要的。这一主题既实用又有趣。以下是对Java内存管理的精彩概述,主要基于Sun Hotspot JVM,但请注意,不同JVM可能有不同的...

    Java的内存管理机制分析

    通过对Java内存管理机制的深入分析,我们可以了解到Java如何高效地管理和利用内存资源。理解这些机制对于优化Java应用程序的性能至关重要,特别是在处理大规模数据集或多线程环境时。此外,合理配置JVM参数和选择...

    java内存管理白皮书

    《Java内存管理白皮书》深入探讨了Java虚拟机(JVM)中的内存管理机制,特别是Sun Microsystems在J2SE 5.0版本中的HotSpot JVM。本文将根据标题、描述、标签以及部分内容,详细解析Java内存管理的核心知识点,包括...

    JAVA 内存管理总结

    【JAVA 内存管理总结】 Java 的内存管理主要涉及对象的生命周期,包括对象的分配和释放。对象的分配主要是通过 `new` 关键字在堆内存(Heap)中完成,而对象的释放则由垃圾回收机制(Garbage Collector, GC)自动...

    JAVA内存管理模式研究.pdf

    "JAVA内存管理模式研究" 在 Java 编程语言中,内存管理是非常关键的机制之一。 Java 虚拟机(JVM)通过对内存的分配和回收来管理内存资源。 本文将详细介绍 Java 的内存管理模式,包括内存区域、内存分配策略、垃圾...

    java内存管理问题及解决办法

    Java内存管理是Java编程中至关重要的一环,它涉及到程序的性能和稳定性。本文将深入探讨Java内存管理机制,包括垃圾回收、内存分配与释放、内存泄漏及其预防措施,以及四种引用类型的特点和应用场景。 首先,Java...

    java内存管理 .pptx

    Java内存管理是Java编程中至关重要的一环,它涉及到Java虚拟机(JVM)如何高效地运行Java代码。在Java中,内存管理主要包括内存区域的划分、对象的生命周期以及垃圾回收机制。 1. **内存区域划分** - **方法区...

    java内存管理深入讲解

    ### Java内存管理深入讲解 #### 一、Java内存模型概览 Java程序的运行依赖于一个精心设计的内存模型,该模型确保了程序在不同环境中的一致性和高效性。Java内存模型主要包括两个部分:栈(Stack)和堆(Heap)。这...

    关于java内存管理的一些理解

    主要关于java虚拟机的运行时数据区域,参考了周志明的深入理解java虚拟机,还涉及到了native方法、垃圾回收机制等等。

    java内存管理的原理.docx

    Java内存管理的原理是Java开发中的重要组成部分,它关乎到应用程序的性能和稳定性。Java虚拟机(JVM)负责自动管理内存,包括对象的分配和回收,以减轻开发人员的负担。然而,深入理解这些原理可以帮助优化代码,...

Global site tag (gtag.js) - Google Analytics