`
huchangan2005
  • 浏览: 78955 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

jvm 内存简介,常见内存异常介绍

阅读更多
1.JVM内存区分为程序计数器、虚拟机栈、本地方法栈、方法区、堆。
程序计数器用来记录命令执行的行数,每个线程都有一个计数器记录当前运行行,基本不占内存。
虚拟机栈和本地方法栈在HotSpot中是一块区域,用来存储基本的8种对象和对象的引用。(-Xss128k 栈的容量为128k,递归2000余次会因为栈深度过大而抛出StackOverflowError)
方法区用来存储加载的类信息、常量、静态变量、即时编译的代码,HotSpot中叫永久代。其中的一部分叫做运行时常量池,用来存储编译期生产的各种字面量和符号应用。(-XX:PermSize=10m -XX:MaxPermSize=10m 设置方法区10m不能扩展,当加载的类过多或者生成的代理过多时,会产生PermGen space 异常)
堆就是对象的存储区域,所有对象和数组都要在堆上分配内存。(-Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError 堆最小20m,最大20m,不能自动扩展,堆溢出--Java heap space 异常--要输出dump)
2.JVM内存回收方式
不是引用计数算法,是根搜索算法,会检测对象是否和GC Root对象们有关联,有就不回收,没有就回收。
回收不是直接回收,如果第一次发现没有和GC Root对象们有关联,会标记一下,如果下次回收时已经有前科,立即回收。期间对象的finalize()方法仅仅会被执行一次,而且不保证肯定会被执行,不要依赖它进行任何操作。
具体操作时:
新生代:JVM会将可以使用的内存划分为几块,在其中一块上保存对象,当需要回收时,将活着的对象移到另一块新区域,然后将整个区域回收。
老年代:将活着的对象定期移动到区域的一端,需要清理时,将活动区域边界以外部分回收。
3.JVM收集器介绍
Serial:单线程中断式收集器,最古老,在单核CPU且允许毫秒级中断的应用上效率最好
ParNew:Serial的多线程版本,Server模式下新生代收集器首选,能和CMS收集器搭配(使用-XX:+UseParNewGC 强制JVM使用ParNew;使用-XX:+UseConcMarkSweepGC 默认启用;可以用-XX;ParallelGCThreads指定GC线程数目)
Parallel Scavenge: 关注于吞吐量(吞吐量优先收集器),和ParNew类似,但是可以设置吞吐量(程序运行100分钟,GC时间1分钟,吞吐量99%)。参数为  -XX:GCTimeRatio 和 -XX:MaxGCPauseMillis。MaxGCPauseMillis表示停顿进行垃圾回收的时间,时间越短收集的次数越多;GCTimeRatio 是总时间比例,设置为19表示垃圾回收时间占用(1/(1+19))5%,默认为99即(1/(1+99))1%。不能和CMS配合。
Serial Old 、Parallel Old: 两者的老年代收集器版本。
Concurrent Mark Sweep: 以获得最短停顿时间为目标的收集器。适合Server端应用(重视响应速度,希望回收停顿时间尽可能短)。默认启用(cpu数量+3)/4 个线程,在4核cpu以上的系统表现很好。但是可能产生“Concurrent Mode Failure”,从而导致一次Ful GC。如果在应用中老年代增长不快,可以适当调整-XX:CMSinitiatingOccupancyFraction的值来增大默认68%的CMS对老年代的回收阀值。但是太高反而会导致CMS出现“Concurrent Mode Failure”,JVM会启用备用的Serial Old来收集老年代,时间反而会更久。还可以设置-XX:+UseCMSCompactAtFullCollection,当每次Full GC后进行一次内存整理,配合-XX;CMSFullGCsBeforeCompaction来计数多少Full GC出发一次内存整理。
G1:相比CMS,G1采用标记整理算法,不会和CMS采用标记清楚算法一样参数内存碎片。同时G1将新生代、老年代划分为更加细致的固定区域,分别进行垃圾回收,避免全区域垃圾回收。维护一个区域优先级列表,每次回收最容易产生垃圾的区域。G1是目前最高效的收集器。
4.JVM内存分配
新生对象在Eden区域分配,Eden区域没有空间时,产生一次Minor GC。(-XX:+PrintGCDetails 用来收集GC日志 -XX:SurvivorRatio=8 Eden区和Survivor区域比是8比1)。
Minor GC相比Full GC非常频繁发生,是指在新生代进行垃圾回收。Major GC/Full GC 是对老年代的垃圾回收,比Minor GC慢十倍以上。通常一次Major GC会伴随一次以上Minor GC。(-Xms20m -Xmx20m -Xmn10m -XX:SurvivorRatio=8 堆起始、最大20m,不能拓展,10m分配给新生代)。
大对象一般会直接进入老年代,所有写程序应该尽可能避免大量的“短生命的大对象”(大字符串、数组等等),这样会频繁触发GC。虚拟机可以使用-XX:PretenureSizeThreshold参数(只对Serial ParNew有效)来配置大于此阀值的对象直接进入老年代。
当一个对象在Eden区域GC后仍然存活,就会被Survivor区域接受,同时设置Age为1,当他的Age逐步增长到15(默认值)时,会被老年代接受。即长期存活对象晋身老年代。年龄阀值可以用-XX:MaxTenuringThreshold设置。当Survivor区域中的大部分对象都是平均年龄,当空间不足时,大于平均年龄的对象可以直接晋身老年代。
当Survivor空间不足,Eden中的对象可能直接进入老年代,如果老年代判断剩余空间不足,直接FULLGC。当判断空间满足时,当 -XX:HandlePromotionFailure 为true时,进行Minor GC,同时将新生代转移到老年代;如果为false,会进行FULL GC。如果老年代判断失误导致新生代进入老年代而出现handel promotion failure,会进行一次FULL GC。
分享到:
评论

相关推荐

    JVM内存空间分配笔记

    ### JVM内存空间分配详解 #### 一、JVM内存模型概览 JVM(Java虚拟机)内存模型主要由以下几个部分组成:程序计数器、Java虚拟机栈、本地方法栈、Java堆以及方法区(在JDK 8之后称为元空间)。下面将对这几个部分...

    JVM内存模型

    JVM内存模型详解 JVM内存模型是Java虚拟机(JVM)中的一种内存管理机制,它将内存区分为永久区内存(Permanent ...通过了解JVM内存模型和对JVM的优化,可以避免内存溢出异常的发生,提高Java应用程序的性能和可靠性。

    JVM内存配置优化

    ### JVM内存配置优化 #### 一、理解JVM内存模型 在进行JVM内存配置优化之前,我们需要了解Java虚拟机(JVM)的内存结构。Java的逻辑内存模型大致分为几个部分: 1. **堆内存(Heap)**:主要用于存储对象实例、数组...

    JVM内存分配与垃圾回收详解

    垃圾收集算法是 JVM 中用于垃圾回收的算法,常见的垃圾收集算法有标记-清除算法、复制算法、标记-压缩算法、分代收集算法等。 总结 本文对 JVM 内存分配与垃圾回收进行了详细的解释,包括 JVM 运行时数据区域、...

    jvm内存溢出

    **JVM内存溢出**是一种常见的运行时错误,指的是程序在执行过程中因为无法获得足够的内存资源而导致的问题。这种问题通常发生在程序尝试分配超出系统可用内存限制的新对象时。了解JVM内存结构是理解内存溢出的关键。...

    java虚拟机jvm及Tomcat中的jvm有关内存的设置与调优

    本文将深入探讨JVM内存管理的基础概念、内存设置方法及其调优策略,以帮助开发者避免常见的`java.lang.OutOfMemoryError`异常,提升应用性能。 #### JVM内存模型概述 Java虚拟机的内存主要由以下几个区域构成: 1...

    JVM性能调优-JVM内存整理及GC回收.pdf

    ### JVM性能调优——JVM内存管理与GC回收详解 #### 概览 在现代软件开发领域,Java凭借其强大的跨平台能力和丰富的生态系统成为企业级应用的首选语言之一。然而,随着应用程序复杂度的提高以及业务需求的变化,...

    JVM内存详解-JVM研究

    ### JVM内存详解:深入探索本机内存的奥秘 #### 1. 本机内存概览 本机内存,即Native Memory,是JVM运行时所依赖的物理内存的一部分,与Java堆内存相区别,主要负责存储JVM自身运行所需的各种资源。包括但不限于...

    JVM内存结构.zip

    JVM内存结构的理解对于优化Java程序性能、避免内存溢出等问题至关重要。以下是对JVM内存结构的详细阐述: 1. **堆内存(Heap)** 堆内存是Java程序中最大的一块内存区域,用于存储对象实例。所有通过`new`关键字...

    jvm内存的运作

    ### JVM内存运作详解 #### 一、Java内存区域与OOM 在深入了解JVM内存运作机制之前,我们需要认识到Java与C/C++之间的显著区别之一在于内存管理。C/C++程序员需要手动管理内存,这意味着他们需要显式地分配和释放...

    tomcat jvm内存修改

    在日常的运维工作中,经常会遇到 Tomcat 应用服务器出现内存溢出的问题,表现为 `java.lang.OutOfMemoryError` 异常。这类问题通常是由于 JVM(Java 虚拟机)配置不当导致的,特别是 PermGen 和 Heap 的大小设置不...

    JVM内存问题最佳实践

    ### JVM内存问题最佳实践 #### 一、选择合适的Java虚拟机 在选择Java虚拟机(JVM)时,有几个关键因素需要考虑。首先,确保选择一个稳定的版本是非常重要的。避免使用刚刚发布或刚添加了大量新功能的版本,因为这些...

    JVM内存溢出

    【JVM内存溢出】指的是Java虚拟机在运行过程中,由于内存分配不当或者内存使用过度导致内存无法正常管理,从而抛出错误的情况。这通常会导致应用程序崩溃或性能急剧下降。在Tomcat这样的Java应用服务器中,内存溢出...

    JVM内存管理和垃圾回收

    总之,JVM内存管理和垃圾回收是Java开发中的重要概念,理解其工作原理有助于编写高效、稳定的代码,并避免因内存问题导致的程序异常。通过不断优化和调整,开发者可以更好地掌控Java应用的性能。

    JVM内存区域.docx

    ### JVM内存区域详解 #### 一、进程与线程概念 ...通过以上详细的介绍,我们可以看出JVM内存区域的划分及其各自的作用非常重要,不仅有助于理解Java程序的执行机制,也为优化程序性能提供了基础。

    java内存机制及异常处理

    常见的内存错误包括`java.lang.OutOfMemoryError: Heap space`(堆空间不足)、`java.lang.OutOfMemoryError: PermGen space`(方法区空间不足)和`java.lang.StackOverflowError`(栈溢出)。这些错误通常由于物理...

    系统内存不足引起异常的解决方法

    `java.lang.OutOfMemoryError:Java heap space`是一个常见的异常,但它通常是可以通过调整JVM参数、优化代码逻辑以及使用适当的工具来检测和解决内存泄露等方式来有效处理的。开发者应当养成良好的编程习惯,及时...

    jvm问题排查

    本手册旨在提供一套全面且实用的JVM问题排查方法和技术,帮助开发者快速定位并解决JVM相关的性能瓶颈或异常情况。 #### 二、基础概念 - **JVM**:Java虚拟机,运行Java程序的核心环境。 - **GC(Garbage ...

    jvm异常分析文件

    本篇文章将深入探讨基于给定文件名的JVM异常分析主题,包括socket端口占用问题和内存溢出系统异常,以及如何解决这些问题以防止异常宕机。 首先,让我们关注"623scoket端口占有和内存溢出系统异常分析"这个文件。...

    JVM相关的常见面试问题汇总.pdf

    ### JVM相关的常见面试问题知识点汇总 #### 1. 什么是JVM? - **定义**: JVM全称Java Virtual Machine,即Java虚拟机,是Java程序运行的底层平台。 - **作用**: 它为Java应用程序提供了一个运行环境,可以执行Java...

Global site tag (gtag.js) - Google Analytics