Java的内存组成:
     Java的内存主要有两种:栈内存(stack)和堆内存(heap)
栈内存的优势是存取速度快,在栈中存放的变量都是在编译期就可确定其值、生命周期的,栈内存最大的一个特点就是数据可以共享。
堆内存的特点是可以动态分配内存,生存期也不必事先告诉编译器,由于他在运行时动态分配内存,所以存取速度较栈慢。
1、     栈内存中主要存放局部变量、基本类型、和对像的引用变量
2、     堆内存中主要存放new创建的对像和数组。

Java的内存泄露是指有被分配的对像,这种对像有两个特点:一是该对像是有引用的,二是该对像永远不会被使用,符合这两个条件的对像,即使永远不会被使用,但由于他是有引用的,GC也不会回收他,长时间的堆积就会造成内存泄露。

内存溢出的详细解决方案:
内在溢出类型:
1、     java.lang.OutOfMemoryError: PermGen space
java主要管理两种类型的内存,堆和方法,堆是给开发人员用的,方法区是JVM自己用的,用来加载类的时候,存放class的信息的,此内存不会被GC回收,如果大量的使用了第三方的Jar包或者有太多的class文件而恰好MaxPermSize设置较小,则会造成内存溢出,JVM默认此内存的大小为4M,解决方法为将将此配置配的大一点,比如:
set JAVA_OPTS=-Xms800m -Xmx800m -XX:PermSize=128M -XX:MaxNewSize=256m -XX:MaxPermSize=256m

2、     java.lang.OutOfMemoryError: Java heap space
上面一种情况只要配置得当一般不会出现,内存溢出主要是这种情况,JVM的默认内存空间(-Xms)为物理内存的1/64,最大内存(-Xmx)为物理内存的1/4。
每次GC后,当内存剩余不到40%的时候,JVM会调整内存到-Xmx的值,当内存剩余超过70%的时候,为调整内存至-Xms,所以服务器的Xmx和Xms设置一般应该设置相同避免每次GC后都要调整虚拟机堆的大小。。假设物理内存无限大,那么JVM内存的最大值跟操作系统有关,一般32位机是1.5g到3g之间,而64位的就不会有限制了。
注意:如果Xms超过了Xmx值,或者堆最大值和非堆最大值的总和超过了物理内存或者操作系统的最大限制都会引起服务器启动不起来。
提示:Heap Size 最大不要超过可用物理内存的80%,一般的要将-Xms和-Xmx选项设置为相同,而-Xmn为1/4的-Xmx值。

JVM调用GC进行垃圾回收的时机:
1、     当应该线程空闲时。
2、     当堆内存不足时
如果连续的内存回收,还是不能解决内存不足的话,就会报OutOfMemorry异常。

Java 比较占内存的原因:
     引用变量是在栈中分配,当程序运行到其作用域之外的时候,该变量即被释放,相应内存也可以用作他用。
     对像和数组是存放在堆内存的,即使程序运行到其作用域之外,没有引用变量引用它时,他也不会被立即释放,而是由gc在适当的时候来回收他,这也是java比较占内存的原因。

垃圾回收的基本算法:
按照基本回收策略:
1、     引用计数:持有对像的引用数,增加一个引用就增加计数,反之义然,垃圾回收时只回收引用计数为0的对像。缺点是不能处理循环引用的问题。
2、     标记-清除:第一阶段从引用根结点标记被引用的对像,第二阶段遍历整个堆,清除没有被标记的对像,缺点是需要暂停整个应用,并产生内存碎片。
3、     复制:此算法把内存空间划为两个相等的区域,每次只使用其中一个区域。垃圾回收时,遍历当前使用区域,把正在使用中的对象复制到另外一个区域中。次算法每次只处 理正在使用中的对象,因此复制成本比较小,同时复制过去以后还能进行相应的内存整理,不会出现“碎片”问题。当然,此算法的缺点也是很明显的,就是需要两 倍内存空间。
4、     标记-整理:此算法结合了“标记-清除”和“复制”两个算法的优点。先标记,后压缩清除。
按照分区对待的方式:
1、     增量收集
2、     分代收集
按照系统线程的方式:
1、     串行收集
2、     并行收集
3、     并发收集

本文转载自:
http://blog.csdn.net/zhangping2056/article/details/7302184

转载于:https://www.cnblogs.com/honeybee/archive/2012/05/17/2506199.html

java内存管理的一些基础,内存溢出的解决方案相关推荐

  1. 操作系统内存管理_操作系统6内存管理基础

    引言 花了一段时间才把之前的笔记整理了一部分,平时太忙也没啥时间.今天开始整理内存管理部分的,内存管理部分大致分为三部分笔记,第一部分就是本篇内存管理基础,第二部分是虚拟内存,第三部分高速缓存. 一个 ...

  2. linux内存管理子系统采用基于内存区域,Linux 内存管理之highmem简介

    一.Linux内核地址空间 一般来说Linux 内核按照 3:1 的比率来划分虚拟内存(X86等):3 GB 的虚拟内存用于用户空间,1GB 的内存用于内核空间.当然有些体系结构如MIPS使用2:2 ...

  3. 【Linux 内核 内存管理】内存管理架构 ② ( 用户空间内存管理 | malloc | ptmalloc | 内核空间内存管理 | sys_brk | sys_mmap | sys_munmap)

    文章目录 一.用户空间内存管理 ( malloc / free / ptmalloc / jemalloc / tcmalloc ) 二.内核空间内存管理 1.内核内存管理系统调用 ( sys_brk ...

  4. java内存管理课程设计_Java内存管理分析

    Java内存主要分为stack, heap, data segment, and code segment. stack(栈):存放非静态基本数据类型变量的名称和值,以及非静态对象的引用 若是非静态基 ...

  5. 操作系统之内存管理:1、内存管理基础知识(指令工作原理、地址转化、程序运行过程)

    1.内存管理基础知识(指令工作原理.地址转化.程序运行过程) 思维导图 什么是内存? 指令的工作原理 装入模块的三种实现 绝对装入 可重定位装入 动态重定位 程序的运行过程 链接的三种方式 思维导图 ...

  6. Java内存管理(一)--内存分区

    出处:http://blog.sina.com.cn/s/blog_7d0e75ab01016vio.html Java提供的内存管理机制是一把双刃剑.好处是java虚拟机帮你完成了几乎所有内存管理的 ...

  7. C语言与JAVA内存管理_C语言动态内存管理和动态内存分配

    动态内存管理同时还具有一个优点:当程序在具有更多内存的系统上需要处理更多数据时,不需要重写程序.标准库提供以下四个函数用于动态内存管理: (1) malloc().calloc() 分配新的内存区域. ...

  8. JVM内存管理概述与android内存泄露分析

    一.内存划分 将内存划分为六大部分,分别是PC寄存器.JAVA虚拟机栈.JAVA堆.方法区.运行时常量池以及本地方法栈. 1.PC寄存器(线程独有):全称是程序计数寄存器,它记载着每一个线程当前运行的 ...

  9. python内存管理变量_Python变量内存管理

    Python变量内存管理 一 .引入 解释器在执行到定义变量的语法时,会申请内存空间来存放变量的值,而内存的容量是有限的,这就涉及到变量值所占用内存空间的回收问题,当一个变量值没有用了(简称垃圾)就应 ...

最新文章

  1. Mysql练习题15-给定数字的频率查询中位数
  2. 学python需要什么基础知识-学Python需要什么基础知识?零基础可以学Python吗?
  3. 修正Android基于ZXing的二维码扫描——横竖屏自由切换
  4. matlab运行支持向量机不出f,求助各位大神关于libsvm,svmpredict总是出不来结果,调试了好久还是不行...
  5. JS构造map/dict结构
  6. Centos7访问本地电脑共享文件夹遇到的问题
  7. 今晚直播丨如何通过APEX实现数据库自动晨检功能
  8. 多项目晶圆(MPW)服务
  9. osqa mysql_osqa安装出现的问题解决办法 | 学步园
  10. FPGA Marvell 88exxxx phy 动起来
  11. iOS悬浮、可拖动、自动吸附屏幕边缘的按钮制作
  12. linux yum源配置
  13. Hybrid App 混合app 开发
  14. 小猫钓鱼(纸牌游戏)-c语言
  15. xfce-因为面板在 kiosk 模式下运行,所以不允许作为普通用户的您更改面板配置
  16. 笔记本电脑网络服务无法使用,打开网络共享中心,一直卡在打开界面或者插入网线后右下角为红叉
  17. MyBatis参数绑定
  18. 微信小程序游戏开发│智力测试游戏——button版
  19. 赵承熙获美国人宽恕,马加爵呢
  20. jmeter安装成功后打不开,提示:Cause: CannotResolveClassException: com.blazemeter.jmeter.threads.concurrency.Conc

热门文章

  1. Linux检查当前运行级别
  2. DB2查询主键、索引、表约束
  3. 华军java_Java SE Runtime Environment 8
  4. 4 相机切换_价格屠夫、训练伴侣——海鸟4K运动相机简评
  5. AR人工智能模型训练计算机,ar人工智能模型训练一般采用什么计算机
  6. 教程:Visual Studio 连接 MySQL 数据库(包含常见错误及解决方法)
  7. 复制构造函数与析构函数
  8. bzoj 4260: Codechef REBXOR(01字典树)
  9. C++ #include iostream #include iostream.h #include string.h区别及作用
  10. js中的4种函数调用模式:函数调用、方法调用、构造器调用、间接调用