`
cfl520
  • 浏览: 7630 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

java内存那点事

阅读更多
  我主要针对的是sum jdk1.5 因为我经常用

       一、首先说sun的jdk  内存概述

        java的内存分为

       堆区 是用我程序使用的区老外起的名字是heap space

       非堆区 也就是永久保留区 老外起的名字是PermGen space 全称是 Permanent Generation space




       堆栈区 java GC来处理垃圾回收的,垃圾回收包括 young gc,full gc

       这个区又被划分了四个区Eden space,Survivor0 space,Survivor1 space,Old space

       我估计是young gc后会对Eden,Survivor0,Survivor1做垃圾回收 然后将Eden的幸存者移到Survivor0或 Survivor1,而一次full gc会对整个heap 做一次垃圾回收 然后将Eden ,Survivor1,Survivor1的幸存者移到Old 中




       非堆区 一般是不做GC垃圾回收的 存放了一些 class 相关的东西 ( 所以我觉得 java的类第一次运行比后面几次慢)

      所以当有一大堆类要加载的时候那他会 抛出臭名昭著的java.lang.OutOfMemoryError: PermGen space

      而有趣的事 spring Hibernate都用的了cglib做方法的拦截 cglib 又用到了asm 。asm是webobject出的一个在运行过程中动态生成class字节码的工具 cglib 通过asm 在内存中生成一个class继承你原有的class然后覆盖需要拦截的方法

把拦截内容写入覆盖的方法中在调用原有方法。这样你看着好像在用自己的类可用的是cglib 动态生成的类这样完成了拦截

可这个样 需要拦截的类比较多就会填满PermGen space而出现java.lang.OutOfMemoryError: PermGen space

    







二、然后是设置jdk的内存


-Xms起始heap内存m

-Xmx最大heap内存m

-XX:PermSize=起始Perm内存M

-XX:MaxPermSize=最大Perm内存M


注:bea jrockit参数PermSize和MaxPermSize 参数是不起作用的因为他没有PermGen space




那sun jdk1.5最大能设置多少内存哪?我们测试一下

---------------------


C:\Program Files\Java\jdk1.5.0_04\bin>java  -XX:MaxPermSize=1445M -version

java version "1.5.0_04"

Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_04-b05)

Java HotSpot(TM) Client VM (build 1.5.0_04-b05, mixed mode)


---------------------




C:\Program Files\Java\jdk1.5.0_04\bin>java  -XX:MaxPermSize=1446M -version

Error occurred during initialization of VM

Could not reserve enough space for object heap

Could not create the Java virtual machine.



---------------------



C:\Program Files\Java\jdk1.5.0_04\bin>java -Xmx1444M -version

java version "1.5.0_04"

Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_04-b05)

Java HotSpot(TM) Client VM (build 1.5.0_04-b05, mixed mode)

-----------------------


C:\Program Files\Java\jdk1.5.0_04\bin>java -Xmx1445M -version

Error occurred during initialization of VM

Could not reserve enough space for object heap

Could not create the Java virtual machine.

-------------------------




C:\Program Files\Java\jdk1.5.0_04\bin>java -Xmx1444M -XX:MaxPermSize=65M -version

java version "1.5.0_04"

Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_04-b05)

Java HotSpot(TM) Client VM (build 1.5.0_04-b05, mixed mode)


------------------------


C:\Program Files\Java\jdk1.5.0_04\bin>java -Xmx1444M -XX:MaxPermSize=66M -version

Error occurred during initialization of VM

Could not reserve enough space for object heap

Could not create the Java virtual machine.

-----------------------



由此可见 jdk1.5 heap space +PermGen space最大不能超过1509M 而 heap space最大不能超过1444M, Gen space最大不能超过1445M

当然这个只是sun1.5的jdk。还有这只是测试的值 实际应用中我们不会将内存设置为这么大因为这是极限值。 内存不是设置的越大越好的。GC的效率并不是看次数而是总时间。若果你设置的很大内存 GC的次数是少了 可每次的时间会变长,打个不不恰当的比喻 你在一个小区里找人和你在一个城市里找人哪个更快?所以要适可而止










三、最后 我们如何监控sun1.5的jdk内存使用哪?


jstat  要介绍下这个命令。

这是jdk命令中比较重要,也是相当实用的一个命令,可以观察到classloader,compiler,gc相关信息

具体参数如下:

-class:统计class loader行为信息

-compile:统计编译行为信息

-gc:统计jdk gc时heap信息

-gccapacity:统计不同的generations(不知道怎么翻译好,包括新生区,老年区,permanent区)相应的heap容量情况

-gccause:统计gc的情况,(同-gcutil)和引起gc的事件

-gcnew:统计gc时,新生代的情况

-gcnewcapacity:统计gc时,新生代heap容量

-gcold:统计gc时,老年区的情况

-gcoldcapacity:统计gc时,老年区heap容量

-gcpermcapacity:统计gc时,permanent区heap容量

-gcutil:统计gc时,heap情况

-printcompilation:不知道干什么的,一直没用过。







例如:



C:\Program Files\Java\jdk1.5.0_04\bin>jstat -gcutil 2748 1000 1000

  S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT


0.00  25.66  88.70  71.05  80.54    423    2.325     2    1.578    3.904

24.82   0.00  18.71  71.05  80.54    424    2.329     2    1.578    3.907

24.82   0.00  34.89  71.05  80.54    424    2.329     2    1.578    3.907

24.82   0.00  72.83  71.05  80.54    424    2.329     2    1.578    3.907

24.82   0.00  90.11  71.05  80.54    424    2.329     2    1.578    3.907

0.00 100.00   9.48  71.95  80.54    425    2.335     2    1.578    3.914

0.00 100.00  27.06  71.95  80.54    425    2.335     2    1.578    3.914

0.00 100.00  47.96  71.95  80.54    425    2.335     2    1.578    3.914

22.69   0.00  11.48  72.75  80.54    426    2.340     2    1.578    3.919

22.69   0.00  11.48  72.75  80.54    426    2.340     2    1.578    3.919


参数含义:

S0:Heap上的 Survivor space 0 段已使用空间的百分比

S1:Heap上的 Survivor space 1 段已使用空间的百分比

E: Heap上的 Eden space 段已使用空间的百分比

O: Heap上的 Old space 段已使用空间的百分比

P: Perm space 已使用空间的百分比

YGC:从程序启动到采样时发生Young GC的次数

YGCT:Young GC所用的时间(单位秒)

FGC:从程序启动到采样时发生Full GC的次数

FGCT:Full GC所用的时间(单位秒)

GCT:用于垃圾回收的总时间(单位秒)


(个人理解,仅供拍砖)
分享到:
评论

相关推荐

    eclipse设置 java内存

    eclipse设置java内存 Eclipse是一个功能强大且广泛使用的集成开发环境(IDE),但是,如果不正确地设置其运行内存,可能会导致内存溢出错误。因此,正确地设置Eclipse的java内存是非常重要的。本文将详细介绍如何...

    java 内存模型 java 内存模型

    java 内存模型 java 内存模型 java 内存模型 java 内存模型

    java内存机制及异常处理

    Java内存机制是Java虚拟机(JVM)的关键组成部分,它管理着程序运行时的数据存储。在Java中,内存主要分为以下几个区域: 1. **Heap(堆)**:这是Java中最主要的内存区域,用于存储所有的类实例和数组。当堆空间...

    Java 内存模型

    Java内存模型是Java虚拟机规范中定义的一部分,它规定了Java程序中变量的读写行为,以及线程之间的交互规则。理解Java内存模型对于编写正确、高效的多线程程序至关重要。在Java 5之前,Java内存模型的描述比较模糊,...

    Java内存泄露及内存无法回收解决方案

    Java内存管理是编程中至关重要的一个环节,尤其是对于大型、长时间运行的应用来说,内存泄漏和内存无法回收可能导致系统性能下降,甚至导致系统崩溃。本文将深入探讨Java内存泄露的原理,分析内存无法回收的原因,并...

    java内存泄露、溢出检查方法和工具

    Java内存管理是开发Java应用程序时的关键环节,内存泄露和溢出问题可能导致系统性能下降,甚至导致服务崩溃。本文将深入探讨如何检测和分析Java内存泄露与溢出,并介绍一种常用的工具——Memory Analyzer(MAT)。 ...

    如何解决Java内存泄漏

    ### 如何解决Java内存泄漏 #### 1. 背景 Java凭借其垃圾回收机制大大简化了内存管理,使得开发者无需手动管理内存的释放,从而提升了开发效率。然而,这种自动化管理也可能成为一把双刃剑,特别是当开发人员忽视...

    java内存原理.doc

    Java 内存原理 Java 内存原理是 Java 语言中的一种基本机制,用于管理和分配内存资源。在 Java 中,内存被分为两种:栈内存和堆内存。 栈内存是指在函数中定义的一些基本类型的变量和对象的引用变量。这些变量在...

    深入理解Java内存模型 pdf 超清版

    Java内存模型,简称JMM(Java Memory Model),是Java编程语言规范的一部分,它定义了程序中各个线程如何访问和修改共享变量,以及如何确保数据的一致性。深入理解Java内存模型对于编写高效的并发程序至关重要。本文...

    java内存管理 ppt

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

    jProfiler7 java内存分析 linux版本

    本篇文章将详细探讨jProfiler7在Java内存分析上的核心功能、使用方法以及在Linux环境中的配置和应用。 1. **内存分析概述** - 内存分析是识别和解决Java应用程序中的内存泄漏、过度对象创建和内存消耗过高问题的...

    JAVA内存监控 JAVA内存监控

    JAVA内存监控 JAVA内存监控 JAVA内存监控 JAVA内存监控 JAVA内存监控 JAVA内存监控

    深入理解Java内存模型

    在深入理解Java内存模型之前,我们需要先了解并发编程模型的分类,然后掌握Java内存模型的基础知识,理解重排序和顺序一致性,以及volatile关键字的相关知识点。 首先,让我们探讨Java内存模型的基础知识。在并发...

    java内存泄漏分析工具

    Java内存泄漏是一个严重的问题,它会导致程序性能下降,甚至可能导致应用程序崩溃。为了有效地诊断和解决这类问题,开发者需要借助特定的分析工具。本篇将详细探讨Java内存泄漏及其相关的分析工具。 内存泄漏是指...

    java管理windows系统内存_java释放内存缓存_java获得CPU使用率_系统内存_硬盘_进程源代码

    "java管理windows系统内存_java释放内存缓存_java获得CPU使用率_系统内存_硬盘_进程源代码" 在Windows操作系统中,内存管理是一个非常重要的方面。Windows实现按需调页的虚拟内存机制,使得应用程序可以使用超过...

    Java内存泄露检测

    Java内存泄露检测是Java开发中一个关键的议题,因为它直接影响到程序的稳定性和资源效率。内存泄露是指程序中已分配的内存无法被正确地释放,从而导致系统资源的浪费和可能导致程序性能下降甚至崩溃。 首先,理解...

    Java内存机制学习和使用

    ### Java内存机制学习和使用 #### 一、Java内存机制概览 Java内存管理是Java开发人员必须掌握的核心概念之一。良好的内存管理不仅能够提升应用性能,还能避免常见的内存泄漏问题。本文旨在深入探讨Java内存机制,...

    JAVA内存分析 - V1.0.0.zip

    Java内存分析是Java开发中非常重要的一个环节,它关乎到应用程序的性能和稳定性。"JAVA内存分析 - V1.0.0.zip" 提供了一套工具来帮助开发者深入理解并优化Java应用程序的内存使用情况。这个压缩包包含了两个关键文件...

    java内存解析(讲的很清楚的视频)

    java内存解析(讲的很清楚的视频)java内存解析(讲的很清楚的视频)java内存解析(讲的很清楚的视频)java内存解析(讲的很清楚的视频)java内存解析(讲的很清楚的视频)java内存解析(讲的很清楚的视频)java内存...

Global site tag (gtag.js) - Google Analytics