Java_基础_内存管理
把没几多年,完全忘记了把自己学的东西记录下来了,现在也基本不知道怎么去记录会更好了,不过好歹妹是把住了~也要毕业了,继续回来写东东记录自己的学习......
一个Java程序在运行时的内存分布主要如上图所示:
CPU是程序逻辑运算部分——不太懂。
register是程序在运行中分配给该程序的CPU寄存器的一部分,用于临时寄存指令或者数据,其调度算法参考操作系统中的寄存器调度。
下面主要讲解一下程序在内存中的结构。
一个Java程序是运行在JVM(Java虚拟机)中的,每个JVM又是一个独立的进程,JVM在操作系统看来与其他的程序没有什么区别。操作系统分配给JVM的内存主要分为两个部分:native部分和分配给程序的内存,其中native内存不太懂,Java程序员也基本不会接触到,我们常讲的Java内存管理指的就是非native部分——分配给Java程序的内存了。
非native的内存主要分成两个部分:非heap区与heap区:
其中non-heap区主要分成了一下几个部分:
静态域:存放程序中用static定义的变量。
常量域:用于存放在编译期确定的,并且被保存在.class文件中的数据,其中包括了一些对象中定义的一些基本类型(int,long,double等),也包括一些对象类型(典型的如string类),还包含一些以文本形式出现的符号引用,比如:
◆类和接口的全限定名;
◆字段的名称和描述符;
◆方法和名称和描述符。
虚拟机必须为每个被装载的类型维护一个常量池。常量池就是该类型所用到常量的一个有序集和,包括直接常量(string,integer和 floating point常量)和对其他类型,字段和方法的符号引用。
对于String常量,它的值是在常量池中的。而JVM中的常量池在内存当中是以表的形式存在的, 对于String类型,有一张固定长度的CONSTANT_String_info表用来存储文字字符串值,注意:该表只存储文字字符串值,不存储符号引 用。说到这里,对常量池中的字符串值的存储位置应该有一个比较明了的理解了。
在程序执行的时候,常量池 会储存在Method Area,而不是堆中。
栈区(stack区):栈区是一个后进先出的内存块,其管理由Java虚拟机自动管理,缺乏灵活性,但是其速度非常快,仅次于寄存器。栈中主要用来存储一下基本数据类型,以及对象引用的句柄(我们在定义对象的时候会申明两个东西:一个保存在栈区的对象的引用以及一个保存在堆区(Heap区)的实际对象)。
non-heap区的大小管理:
程序员在编写程序的过程中是不能够直接管理non-heap区的,但是能够在程序运行之前进行一些参数设置,设置non-heap区的大小,其参数设置如下:
-XX:PermSize,这个参数用于设置JVM中的non-heap区的初始大小,默认为机器内存的1/64
-XX:MaxPermSize,这个参数用于设置JVM中的non-heap区的最大大小,默认为机器内存的1/4,
使用例子如下:
-XX:PermSize=64m
-XX:MaxPermSize=1024m.
non-heap区大小调节时期:我也不知道,弄清楚了再填回来,不过这个不重要。。。。
non-heap区会抛出的异常:OutOfMemoryError: PermGen space
Heap区(堆区):
堆区才真正是我们讨论Java内存管理方案时说到的部分,non-heap区的内存管理完全由JVM自行管理,程序员不能够自主的去进行管理,而堆区则让程序员在某种程度上能够对程序的内存进行管理。
Heap区保存的东西:heap区是一个运行时数据存储区,是Java在运行时才分配的空间,也是大部分对象的保存区域,程序可以通过new等关键字来进行堆空间的分配。
Heap区的大小管理:Heap区的大小由JVM自行调整,但是程序员可以通过设置程序的启动参数来对其大小进行设置:
-Xms:用于设置Java heap区的初始值大小, 其默认值是机器内存大小的1/64,
-Xmx:用于设置Java heap区的最大值,其默认值是机器内存大小的1/4,
使用示例如下:
-Xms256m
-Xmx1024m
Heap区的分配管理:heap区的分配管理即是我们所常说的Java垃圾回收机制了。
垃圾回收原理:Java垃圾回收机制会自动回收内存中的垃圾对象并释放对象所占用的内存。
垃圾对象的定义:由上面可以知道,一个对象被定义以后即在heap区上给其分配了一块空间,当这个对象永远不再被引用或者从JVM的根集合不能够达到该对象的时候,此对象及被定义为垃圾对象。也即是当一个对象的引用计数为0的时候此对象将被定义为垃圾对象。
垃圾回收过程:1、JVM的gc先找到垃圾对象,2、JVM调用改对象的finalize方法(如果此时不想此对象被回收,可以在这里抢救一下,给他一个引用),3、当JVM再次执行GC时,弱此对象仍未垃圾对象,则回收其所占有的内存空间。在一个对象的整个回收过程中,JVM执行了两次,并运行了finalize方法一次。
垃圾回收的具体逻辑和过程,例如对象的引用计数,新生代、旧生代的划分,强引用、弱引用、软引用等具体细节可以参考文章最后的连接
Heap区会抛出的异常:java.lang.OutOfMemoryError: Java heap space
本文参考:http://developer.51cto.com/art/201009/225071_all.htm http://blog.csdn.net/chjttony/article/details/6012490 http://www.blogjava.net/chhbjh/archive/2012/01/28/368936.html
上面也只是我自己的理解,勿打头......
Java_基础_内存管理的更多相关文章
- .NET基础拾遗(1)类型语法基础和内存管理基础
Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开发基 ...
- 【IOS学习基础】内存管理
1.内存几大区域 1> 栈区:局部变量(基本数据类型.指针变量). 2> 堆区:程序运行的过程中动态分配的存储空间(创建的对象). 3> BSS段:没有初始化的全局变量和静态变量. ...
- 2-Python基础语法-内存管理-运算符-程序控制
目录 1 Python 基础语法 1.1 注释 1.2 缩进 1.3 续行 1.4 标识符 1.5 转义序列 1.6 数字 1.7 字符串 1.8 其他 2 Python 运算符 2.1 赋值运算符 ...
- .NET基础拾遗(1)类型语法基础和内存管理基础【转】
http://www.cnblogs.com/edisonchou/p/4787775.html Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理 (3)字符串 ...
- Java基础--Java内存管理与垃圾回收
Java自动内存管理 在讲解内存管理之前,首先需要了解对象和对象引用的区别 对象是类的一个实例,以人这个类为例,Person是我们定义的一个类 public class Person{} publ ...
- .NET基础拾遗(1)类型语法基础和内存管理基础2
二.内存管理和垃圾回收 2.1 .NET中栈和堆 每一个.NET应用程序最终都会运行在一个OS进程中,假设这个OS的传统的32位系统,那么每个.NET应用程序都可以拥有一个4GB的虚拟内存..NET会 ...
- Java基础知识--内存管理
Java语言中 的垃圾收集器相对于以前的其他语言优势是什么? 过去的语言需要程序员显示的进行分配内存.释放内存.这种做法可能会引起“内存泄漏”,即由于某种原因是分配给程序的内存无法释放,如果该任务不断 ...
- c#基础-自动内存管理
1.自动垃圾回收是什么? 在非托管环境下程序员要自已管理内存,由疏忽的原因,通常会犯两种错误,请求内存后在不使用时忘记释放,或使用已经释放了的内存.但在托管环境下,程序员不用担心这两个问题,C ...
- Swift基础语法-内存管理, 自动引用计数
1. 工作机制 Swift和OC一样,采用自动引用计数来管理内存 当有一个强引用指向某一个对象时,该对象的引用计数会自动+1 当该强引用消失时,引用计数会自动-1 当引用计数为0时,该对象会被销毁 2 ...
随机推荐
- 数据结构 -- 图的最短路径 Java版
作者版权所有,转载请注明出处,多谢.http://www.cnblogs.com/Henvealf/p/5574455.html 上一篇介绍了有关图的表示和遍历实现.数据结构 -- 简单图的实现与遍历 ...
- 【转】大数据以及Hadoop相关概念介绍
原博文出自于: http://www.cnblogs.com/xdp-gacl/p/4230220.html 感谢! 一.大数据的基本概念 1.1.什么是大数据 大数据指的就是要处理的数据是TB级别以 ...
- STM32中的位带(bit-band)操作
转:http://blog.csdn.net/gaojinshan/article/details/11479929 //位带操作,实现51类似的GPIO控制功能 //具体实现思想,参考<< ...
- 关于诺顿身份安全2013独立版(Norton Identity Safe)
现在身份安全这货好像从诺顿的套装当中独立出来了,出了中文版.其实诺顿的Web信誉做得还是不错的,当然天朝不要有太大期望.只是公认的做web信誉做得最好的应该就是趋势科技和诺顿,所以诺顿的身份安全也许还 ...
- emWin(ucGui) Edit控件数值模式 ——符号编辑 worldsing
emWin(ucGui) Edit控件数值模式出现负数值编辑时,如果键盘按键全可以设置独立的"-","+"键,这样可以正常编辑正数和负数,但是要没有设置这两个键 ...
- POJ 1947 Rebuilding Roads (树dp + 背包思想)
题目链接:http://poj.org/problem?id=1947 一共有n个节点,要求减去最少的边,行号剩下p个节点.问你去掉的最少边数. dp[u][j]表示u为子树根,且得到j个节点最少减去 ...
- Codeforces Round #292 (Div. 1) B. Drazil and Tiles (类似拓扑)
题目链接:http://codeforces.com/problemset/problem/516/B 一个n*m的方格,'*'不能填.给你很多个1*2的尖括号,问你是否能用唯一填法填满方格. 类似t ...
- CodeForces Gym 100685C Cinderella (水题)
题意:给定 n 个杯子,里面有不同体积的水,然后问你要把所有的杯子的水的体积都一样,至少要倒少多少个杯子. 析:既然最后都一样,那么先求平均数然后再数一下,哪个杯子的开始的体积就大于平均数,这是一定要 ...
- Base64把图片、文件转码成字符串(互转)
文件Base64以后会翻倍的涨,例如一张52kb的图片 base64以后string文件大小为185kb,在通过string转回图片为135kb 图片转文字: UIImage *_originIm ...
- 无责任Windows Azure SDK .NET开发入门篇三[使用Azure AD 管理用户信息--3.4 Edit修改用户信息]
3.4 Edit修改用户信息 我们用FormCollection简化了表单提交,非常方便的进行用户信息修改. [HttpPost, Authorize] public async Task<Ac ...