一、java内存管理及垃圾回收

jvm内存组成结构

jvm栈由堆、栈、本地方法栈、方法区等部分组成,结构图如下所示:

(1)堆

所有通过new创建的对象的内存都在堆中分配,堆的大小可以通过-Xmx和-Xms来控制。堆被划分为新生代和旧生代,新生代又被进一步划分成Eden区和Survivor区,最后Survivor由From Space和To Space组成,结构图如下所示:

新生代。新建的对象都是用新生代分配内存,Eden空间不足的时候,会把存活的对象转移到Survivor中。新生代大小可以由-Xmn来控制,也可以用-XX:SurvivorRatio来控制Eden和Survivor的比例。

旧生代。用于存放新生代中经过多次垃圾回收仍然存活的对象。

(2)栈

每个线程执行每个方法的时候都会在栈中申请一个栈帧,每个栈帧包括局部变量区和操作数栈,用于存放此次方法调用过程中的临时变量、参数和中间结果。

-Xss:设置每个线程的栈帧大小。JDK1.5+每个线程栈帧大小为1M,一般来说如果栈不是很深的话,1M是绝对够用的。

(3)本地方法栈

用于支持native方法的执行,储存了每个native方法调用的状态。

(4)方法区

存放了要加载的类信息、静态变量、final类型的常量、字段和方法信息。jvm用持久带来存放方法区,可通过-XX:PermSize和-XX:PermMaxSize来指定最小值和最大值。

垃圾回收按照基本回收策略分

引用计数(Reference Counting)

比较古老的回收算法。原理是此对象有一个引用,即增加一个计数,删除一个引用则减少一个计数,垃圾回收时,只用收集计数为0的对象。此算法最致命的是无法回收循环引用的对象。

标记-清除(Mark-Sweep)

此算法执行分两阶段。第一阶段从根引用节点开始标记所有被引用的对象,第二个阶段遍历整个堆,把未标记的对象清除。此算法需要暂停这个应用,同时会产生内存碎片。

复制(Copying)

此算法把内存空间划为两个相等的区域,每次只使用其中一个区域。垃圾回收时,遍历当前使用区域,把正在使用的对象复制到另外一个区域中。算法每次只处理正在使用中的对象,因此复制成本比较小,同时复制过去以后还能进行相应的内存整理,不会出现“碎片”的问题。当然,此算法的缺点也是很明显的,就是需要两倍内存空间

标记-整理(Mark-Compact)

此算法结合了“标记-清除”和“复制”两个算法的优点。也是分两个阶段,第一阶段从根节点开始标记所有被引用的对象,第二阶段遍历整个堆,把清除未标记对象并且把存活对象“压缩”到堆的其中一块。此算法避免了“标记-清除”的碎片问题,同时也避免了“复制”算法的空间问题。

二、jvm内存调优

首先需要注意的是在对jvm内存调优的时候不能只看操作系统级别java进程所占的内存,这个数值不能准确的反映堆内存的真实占用情况。因为GC过后这个值是不会变化的,因此内存调优的时候更多地使用JDK提供的内存查看工具,比如JConsole和Java VitualVM。

对jvm内存的系统级的调优主要的目的是减少GC的频率和Full GC的次数,过多的GC和Full GC是会占用很多的系统资源(主要是CPU),影响系统的吞吐量。特别要关注FUll GC,因为它会对整个堆进行整理,导致Full GC一般有以下几种情况

旧生代空间不足

Permanent Generation空间不足

system.gc()被显示调用

调优主要手段是通过控制堆内存的各个部分的比例和GC策略来实现。

各部分比例不良设置导致的后果:

1)新生代设置过小

2)新生代设置过大

3)Survivor设置过小

4)Survivor设置过大

jvm原理及调优的更多相关文章

  1. JDK记录-JVM原理与调优(转载)

    转载自<https://www.cnblogs.com/andy-zhou/p/5327288.html> 一.什么是JVM JVM是Java Virtual Machine(Java虚拟 ...

  2. Java 面试题 三 <JavaWeb应用调优线程池 JVM原理及调优>

    1.Java Web应用调优线程池 不论你是否关注,Java Web应用都或多或少的使用了线程池来处理请求.线程池的实现细节可能会被忽视,但是有关于线程池的使用和调优迟早是需要了解的.本文由浅入深,介 ...

  3. JVM底层原理及调优之笔记一

    JVM底层原理及调优 1.java虚拟机内存模型(JVM内存模型) 1.堆(-Xms -Xmx -Xmn) java堆,也称为GC堆,是JVM中所管理的内存中最大的一块内存区域,是线程共享的,在JVM ...

  4. [Spark性能调优] 第一章:性能调优的本质、Spark资源使用原理和调优要点分析

    本課主題 大数据性能调优的本质 Spark 性能调优要点分析 Spark 资源使用原理流程 Spark 资源调优最佳实战 Spark 更高性能的算子 引言 我们谈大数据性能调优,到底在谈什么,它的本质 ...

  5. 一文读懂Java GC原理和调优

    概述 本文介绍GC基础原理和理论,GC调优方法思路和方法,基于Hotspot jdk1.8,学习之后将了解如何对生产系统出现的GC问题进行排查解决 阅读时长约30分钟,内容主要如下: GC基础原理,涉 ...

  6. 老大难的GC原理及调优,这下全说清楚了

    概述 本文介绍GC基础原理和理论,GC调优方法思路和方法,基于Hotspot jdk1.8,学习之后将了解如何对生产系统出现的GC问题进行排查解决 阅读时长约30分钟,内容主要如下: GC基础原理,涉 ...

  7. 2020年薪30W的Java程序员都要求熟悉JVM与性能调优!

    前言 作为Java程序员,你有没有被JVM伤害过?面试的时候是否碰到过对JVM的灵魂拷问?   一.JVM 内存区域划分 1.程序计数器(线程私有) 程序计数器(Program Counter Reg ...

  8. SQL运行内幕:从执行原理看调优的本质

    相信大家看过无数的MySQL调优经验贴了,会告诉你各种调优手段,如: 避免 select *: join字段走索引: 慎用in和not in,用exists取代in: 避免在where子句中对字段进行 ...

  9. 最全JVM与性能调优知识点总结,看看哪些是你还没掌握的?

    前言 JVM调优是每个高级程序员的必修课,在本章中,我会从发展过程以及核心价值来剖析JVM的体系结构.为了让大家更好的理解JVM的工作机制, 我会在讲解完运行时数据区之后,再通过一个类的加载过程到这个 ...

随机推荐

  1. c语言,求字符数组的长度

    练手代码,适用初级码农: #include<stdlib.h> #include<stdio.h> #include<assert.h> int count(con ...

  2. C# 从Excel2003将数据导入到SQL2005,数据发生截断的问题分析

    C# 从Excel2003将数据导入到SQL2005,数据发生截断的问题分析 问题描述:大家没有遇到过这种情况使用自己编写的工具读取Excel2003文件中的数据,然后执行插入语句将数据批量导入到SQ ...

  3. ibatis配置log4j输出sql日志信息

    为了在开发过程更加直观,我们需要将ibatis日志打开以便观察ibatis运作的细节. ibatis采用Apache common_logging,并结合Apache log4j作为日志输出组件. 在 ...

  4. C#跨窗体调用控件(委托回调函数使用例子)

    问题: 有两个窗体,FORM1(含一个label控件,一个名为显示form2的button控件)和FORM2(含一个button控件).启动时,FORM1中点击button控件显示form2使FORM ...

  5. IOS touch event animation 转动的风车

    最近开始学习IOS的开发,师兄给我提出一个需求:实现一个可拖动的转盘.师兄提示我说利用touch event和UIView animation.经过一两天的折腾边学边做,算是实现了基本功能.这里写写加 ...

  6. python JSON API duckduckgo search engine 使用duckduckgo API 尝试搜索引擎

    The duckduckgo.com's search engine is very neat to use. Acutally it has many things to do with other ...

  7. 惊喜:opera换webkit内核后完美支持SDCH压缩协议

    csdn发邮件警告说再不发文章就取消我的专家头衔了.呵呵,其实我只是在csdn暴露了我的帐号密码以后不得已把csdn密码修改成一个我自己都记不住的货,所以很少上来了. 言归正传.我们从去年就在QQ空间 ...

  8. oralce 10g 官方认证的操作系统版本

    oralce 10g 官方认证的操作系统版本 Operating system x86              Red Hat Enterprise Linux AS/ES 3 (Update 4 ...

  9. 论移动端Hybid开发

    以下内容code地址:https://github.com/wytings/Hybrid 背景:公司业务的发展和开发需求升级,我们需要Hybrid了.市面上有很多开源的Hybrid框架给我们直接使用, ...

  10. 使用多个DNS供应商以缓解DDoS攻击

        随着不安全物联网(IoT)设备的激增,针对域名系统(DNS)供应商的分布式拒绝服务(DDoS)攻击在数量和规模上正在不断增加.这些攻击随之影响依赖于这些供应商进行域名解析的网站.虽然DNS供应 ...