`

JAVA 内存管理

    博客分类:
  • java
 
阅读更多

 

 

垃圾回收机制:java内存包括堆、栈、元数据区

栈:线程工作的地方

元数据区:存放加载的Class以及一些元数据的信息。

 

堆分代说明:

堆:分为新生代、年老代(存放存活时间比较长的对象)
新生代分为 E区、S1区、S2区 
新生代:年老代=1:2 即新生代为堆的1/3  , 年老代为总内存的2/3(可以通过 –XX:NewRatio )
        新生代的比值为 8:1:1 ,即E区占新生代的8/10 ,其余内存两个s区各为一半(通过 –XX:SurvivorRatio设定)
新生代每个区域满了都会触发Minor的GC,每次存活对象都会通过拷贝算法进入到下个区域,最终进入年老代
当年老代满了就会触发FullGC,时间比较长会影响系统服务,尽量避免。

打印参数说明: -XX:+PrintGCDetails

  

可以打印虚拟机的垃圾回收情况,MinorGC只会影响年轻代内存,Full GC会影响年轻代、年老代和元数据的内存情况。
PSYoungGen 年轻代
ParOldGen年老代
Metaspace(保存一些常量和类对象): 元数据区 
 

 代码:

  

/**
 * -Xms60m -Xmx60m  -XX:NewRatio=2   -XX:SurvivorRatio=8  -XX:+PrintGCDetails
 堆最小  、最大堆、新生代大小、年轻代与年老代比值1:2 、 s区与E区比值1:8:8 ,打印GC详细
 * @author admin
 */
public class TestGC2 {

	public static void main(String[] args) {

        Integer M = new Integer(1024 * 1024 * 1); // 单位, 兆(M)
        byte[] bytes = new byte[1 * M]; // 申请 1M 大小的内存空间
        bytes = null; // 断开引用链
        System.gc(); // 通知 GC 收集垃圾
        System.out.println();
        bytes = new byte[1 * M]; // 重新申请 1M 大小的内存空间
        bytes = new byte[1 * M]; // 再次申请 1M 大小的内存空间
        System.gc();
        System.out.println();
	}
}

 日志以及解释:

      

日志解释:
	[GC (System.gc()) [PSYoungGen: 2621K->600K(37888K)] 2621K->608K(123904K), 0.0009580 secs] [Times: user=0.00 sys=0.00, real=0.05 secs] 
	{ [GC [新生代: MinorGC前新生代内存使用->MinorGC后新生代内存使用(新生代总的内存大小)] 
	MinorGC前JVM堆内存使用的大小->MinorGC后JVM堆内存使用的大小(堆的可用内存大小), 
	MinorGC总耗时] [Times: 用户耗时=0.00 系统耗时=0.00, 实际耗时=0.06 secs] }

	[Full GC (System.gc()) 
	[PSYoungGen: 600K->0K(37888K)] 
	[ParOldGen: 8K->530K(86016K)] 608K->530K(123904K), 
	[Metaspace: 2641K->2641K(1056768K)], 0.0065158 secs] 
	[Times: user=0.00 sys=0.00, real=0.01 secs] 

	{ [Full GC [PSYoungGen: 568K->0K(28672K)] 
	[老年代: FullGC前老年代内存使用->FullGC后老年代内存使用(老年代总的内存大小)]  FullGC前JVM堆内存使用的大小->FullGC后JVM堆内存使用的大小(堆的可用内存大小) 
	[元数据区: 2484K->2483K(21504K)], 0.0178331 secs] 
	[Times: user=0.01 sys=0.00, real=0.02 secs]}

 打印出来的GC详细信息,各个区占用的内存情况,可以计算出各个区占用内存的比例情况,验证设置的参数正确性

   

Heap
 PSYoungGen      total 18432K, used 164K [0x00000000fec00000, 0x0000000100000000, 0x0000000100000000)
  eden space 16384K, 1% used [0x00000000fec00000,0x00000000fec29100,0x00000000ffc00000)
  from space 2048K, 0% used [0x00000000ffe00000,0x00000000ffe00000,0x0000000100000000)
  to   space 2048K, 0% used [0x00000000ffc00000,0x00000000ffc00000,0x00000000ffe00000)
 ParOldGen       total 40960K, used 1553K [0x00000000fc400000, 0x00000000fec00000, 0x00000000fec00000)
  object space 40960K, 3% used [0x00000000fc400000,0x00000000fc584730,0x00000000fec00000)
 Metaspace       used 2649K, capacity 4486K, committed 4864K, reserved 1056768K
  class space    used 286K, capacity 386K, committed 512K, reserved 1048576K

 

附:JVM常用参数

    

-XX:+<option> 启用选项
-XX:-<option>不启用选项
-XX:<option>=<number>
-XX:<option>=<string>

堆设置
-Xms :初始堆大小
-Xmx :最大堆大小
-Xmn:新生代大小。通常为 Xmx 的 1/3 或 1/4。新生代 = Eden + 2 个 Survivor 空间。实际可用空间为 = Eden + 1 个 Survivor,即 90%
-XX:NewSize=n :设置年轻代大小
-XX:NewRatio=n: 设置年轻代和年老代的比值。如:为3,表示年轻代与年老代比值为1:3,年轻代占整个年轻代年老代和的1/4
-XX:SurvivorRatio=n :年轻代中Eden区与两个Survivor区的比值。注意Survivor区有两个。如:3,表示Eden:Survivor=3:2,一个Survivor区占整个年轻代的1/5
-XX:PermSize=n 永久代(方法区)的初始大小
-XX:MaxPermSize=n :设置永久代大小
-Xss 设定栈容量;对于HotSpot来说,虽然-Xoss参数(设置本地方法栈大小)存在,但实际上是无效的,因为在HotSpot中并不区分虚拟机和本地方法栈。
-XX:PretenureSizeThreshold (该设置只对Serial和ParNew收集器生效) 可以设置进入老生代的大小限制
-XX:MaxTenuringThreshold=1(默认15)垃圾最大年龄 如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代. 对于年老代比较多的应用,可以提高效率.如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活 时间,增加在年轻代即被回收的概率
该参数只有在串行GC时才有效.
收集器设置
-XX:+UseSerialGC :设置串行收集器
-XX:+UseParallelGC :设置并行收集器
-XX:+UseParallelOldGC :设置并行年老代收集器
-XX:+UseConcMarkSweepGC :设置并发收集器
垃圾回收统计信息
-XX:+PrintHeapAtGC GC的heap详情
-XX:+PrintGCDetails GC详情
-XX:+PrintGCTimeStamps 打印GC时间信息
-XX:+PrintTenuringDistribution 打印年龄信息等
-XX:+HandlePromotionFailure 老年代分配担保(true or false)
-Xloggc:gc.log 指定日志的位置
并行收集器设置(用户线程会暂停)
-XX:ParallelGCThreads=n :设置并行收集器收集时使用的CPU数。并行收集线程数。
-XX:MaxGCPauseMillis=n :设置并行收集最大暂停时间
-XX:GCTimeRatio=n :设置垃圾回收时间占程序运行时间的百分比。公式为1/(1+n)
并发收集器设置(程序不会暂停)
-XX:+CMSIncrementalMode :设置为增量模式。适用于单CPU情况。
-XX:ParallelGCThreads=n :设置并发收集器年轻代收集方式为并行收集时,使用的CPU数。并行收集线程数。

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    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内存管理技巧

    以下是一些关于Java内存管理的技巧和注意事项: 1. **避免使用`new Boolean()`和`new Integer()`** - `Boolean`和`Integer`都是Java中的包装类,它们用于封装基本类型`boolean`和`int`。在创建`new Boolean()`或`...

    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