作为一个任何完整的机器都会有内存管理这块组成结构。作为jvm也有自己的内存管理。

1.那么在java中哪些组件需要使用内存。

a)        Java堆

b)       线程:线程是在jvm运行实际程序的实体

c)        类和类加载器:jvm只会加载一个类到内存一次

d)       NIO

e)        JNI:java本地接口

2那么JVM内存结构是什么?

其实jvm的内存结构是按照运行时数据的存储结构来划分内存结构的。

而在JVMjava运行时数据分为6种:

a)        pc寄存器:是一种数据结构,用来保存当前正常执行的程序内存地址。

b)       java栈:当线程创建就会建立对应的栈。但是这个数据线程是不共享的,所以无同步锁。

c)        堆:java存储数据的地方。

d)       方法区:是一种特殊的堆,是堆的永久区

e)        本地方法区:

f)        运行常量池

上面说的六种其实主要永久就是堆和栈

3.那么我说说堆和栈的区别

栈和线程密切相关。所以一个线程的创建对建立对应的栈,栈这种数据结构存储数据快,而且只要数据存放在栈中,在编译的时候就给分配内存空间的。既然在编译的时候分配了内存空间,这不就说明了一个问题,栈的大小和生命周期是确定的。想想这些确定的数据所以存储的数据就是一些基本的数据类型和句柄对象(引用)。比如说一说int这些基本类型我们就知道我们会给他分配一个四个字节的大小。所以这些在编译的时候都能完成。而且要知道栈中的数据是共享的。

堆是一种运行时数据,在运行时候给他分配大小。所以他的优势就是特别灵活。而且我们所说的GC就是针对堆说的。堆我们都知道存放的是对象。所以一般new,newarray,等指令建立都会存放在堆中。

所以总结堆和栈的区别:在栈中数据大小确定,生命周期确定,运行速度快,仅次与寄存器,数据共享,一般存放基本数据结构和引用类型。但是缺少灵活行。堆用来存放对象,在运行时创建对象,数据灵活,对象的回收通过gc机制。由于动态存储所以速度就慢。

前面说了堆的一点小知识,也说了gc。

4.那么gc的原理是什么?

Gc就是垃圾回收器。垃圾回收器必须能完成两件事情:一个能够正确检测垃圾对象,一个能释放对象占内存的空间。

所以看到上面话的定义相信很清楚,gc是针对对象的。对象存放在堆中,所以上面我说的不虚。

Gc的原理就是首先我们将所有的对象描绘成一棵树形结构,然后通过遍历算法搜索这棵树,从根一直遍历。如果能遍历得到对象我们称这是活动对象,如果不能遍历到就说这个对象是非活动的对象。对于非活动对象就是相对与内存的垃圾,只占内存空间资源,但是我们却调用不到。对于这样的对象我们就将其销毁。

为了提高垃圾回收的效率,人们发明一个分代算法。分代顾名思义就是将对象按照年龄划分。分年轻代和年老代。对于新建的对象对象被划分在年轻代,如果对象经过回收仍然存活就把他调到年老代。那么我们每次扫描就频繁扫描年轻代,年老调用的较少就次数扫描的少。这样做的好处就是可以减少扫描的次数。从而提高gc效率.

5还有关于内存溢出。首先明白一点,内存溢出的原因是什么?

内存溢出就是所有占用内存的组件(我最开始说的那几种)在内存中一直占用资源,且不断增加,而内存大小固定。那么这种情况资源迟早会用完就会出现内存溢出。

所以你应该明白一点。内存溢出不仅仅是堆数据溢出(对象溢出)。这只是一个方面。当然了。只要有东西占用内存这个东西就用可能造成数据溢出。

在显示生活中堆和栈的溢出是很常见的。

比如说一个对象创建了,但是呢对象用完了其实就没有意义了。应该及时释放。可是没有释放。这样的垃圾对象一多就容易内存溢出。这是关于堆溢出的。

还有比如说一个循for int i=0;i<10000;i++){}这里的i就是在这里用那么一下,所以他的生命周期在这里用完就行了。可是有人却非要把这个生命周期延长。把int i定义在外面。

这样一循环完了但是int i会一直存在,这样他就一直在栈中占据内存。这就是一种短周期的东西非要用长生命周期使用。这种东西一多就造成内存的浪费,就是一种栈溢出。

不得不看的JVM内存管理的更多相关文章

  1. Java之美[从菜鸟到高手演变]之JVM内存管理及垃圾回收

    很多Java面试的时候,都会问到有关Java垃圾回收的问题,提到垃圾回收肯定要涉及到JVM内存管理机制,Java语言的执行效率一直被C.C++程序员所嘲笑,其实,事实就是这样,Java在执行效率方面确 ...

  2. JVM内存管理及垃圾回收【转】

    很多Java面试的时候,都会问到有关Java垃圾回收的问题,提到垃圾回收肯定要涉及到JVM内存管理机制,Java语言的执行效率一直被C.C++程序员所嘲笑,其实,事实就是这样,Java在执行效率方面确 ...

  3. JVM内存管理及垃圾回收

    一.JVM内存的构 Java虚拟机会将内存分为几个不同的管理区,这些区域各自有各自的用途,根据不同的特点,承担不同的任务以及在垃圾回收时运用不同的算法.总体分为下面几个部分: 程序计数器(Progra ...

  4. 现代JVM内存管理方法的发展历程,GC的实现及相关设计概述(转)

    JVM区域总体分两类,heap区和非heap区.heap区又分:Eden Space(伊甸园).Survivor Space(幸存者区).Tenured Gen(老年代-养老区). 非heap区又分: ...

  5. java虚拟机学习-JVM内存管理:深入垃圾收集器与内存分配策略(4)

    Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来. 概述: 说起垃圾收集(Garbage Collection,下文简称GC),大部分人都把这项 ...

  6. java虚拟机学习-JVM内存管理:深入Java内存区域与OOM(3)

    概述 Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来. 对于从事C.C++程序开发的开发人员来说,在内存管理领域,他们即是拥有最高权力的皇帝又 ...

  7. Java的内存 -JVM 内存管理

    一.综述 如果你学过C或者C++,那么你应该感受过它们对内存那种强大的掌控力.但是强大的能力往往需要更强大的控制力才能保证能力不被滥用,如果滥用C/C++的内存管理那么很容易出现指针满天飞的情况,不出 ...

  8. JVM内存管理及GC机制

    一.概述 Java GC(Garbage Collection,垃圾收集,垃圾回收)机制,是Java与C++/C的主要区别之一,作为Java开发者,一般不需要专门编写内存回收和垃圾清理代码,对内存泄露 ...

  9. Java内存模型和JVM内存管理

    Java内存模型和JVM内存管理   一.Java内存模型: 1.主内存和工作内存(即是本地内存): Java内存模型的主要目标是定义程序中各个变量的访问规则,即在JVM中将变量存储到内存和从内存中取 ...

随机推荐

  1. 20 个非常棒的jQuery内容滑动插件

    Wow Slider  WOW Slider是一款小巧易用的网页滑块设计.该软件内置大量的模版和工具,让你轻松设计出完美的视觉效果.他还可以帮助用户在短时间内创造出梦幻般的滑块,而无需编码和图像编辑, ...

  2. LoadRunner测试下载功能点脚本(方法二)

    在上一篇<LoadRunner下载功能点脚本(方法一)>中,实现的脚本仅是录制下载功能点的脚本,现在性能需求的场景更改如下: 性能需求:对系统某页面中,点击下载并将下载文件保存到本地电脑的 ...

  3. android 中文件加密 解密 算法实战

    现在项目里面有一个需求,本项目里面下载的视频和文档都不允许通过其他的播放器播放,在培训机构里面这样的需求很多.防止有人交一份钱,把所有的课件就拷给了别人.这样的事情培训机构肯定是不愿意的.现在我项目里 ...

  4. HTMl5的sessionStorage和localStorage(转)

    html5中的Web Storage包括了两种存储方式:sessionStorage和localStorage. sessionStorage用于本地存储一个会话(session)中的数据,这些数据只 ...

  5. (转).net程序员转战android第二篇---牛刀小试

    上篇说道如何搭建android的开发环境,这一篇我们将牛刀小试一下, 完成我们第一个android APP应用. 我就从新建项目说起吧. 首先打开Eclipse,选择顶部的File(文件)——new( ...

  6. 《第一行代码》学习笔记12-UI(1)

    1.程序需要注销或者退出,用一个专门的集合类对所有的活动进行管理即可. 2.可视化编辑工具不利于真正了解界面背后的实现原理,通常这种方式制作的界面都不具有很好的屏幕适配性, 而且当需要编写较为复杂的界 ...

  7. Mysql学习(慕课学习笔记4)创建数据表、查看数据表、插入记录

    创建数据表 Create table [if not exists] table_name(column_name data_type,…….) UNSIGNED 无符号SIGNED 有符号 查看创建 ...

  8. C# ITextSharp pdf 自动打印

    PDF生成后直接进入打印预览不用下载 using iTextSharp.text; using iTextSharp.text.pdf; Document pdfDoc = new Document( ...

  9. Nutch关于robot.txt的处理

    在nutch中,默认情况下尊重robot.txt的配置,同时不提供配置项以忽略robot.txt. 以下是其中一个解释.即作为apache的一个开源项目,必须遵循某些规定,同时由于开放了源代码,可以简 ...

  10. Python正则匹配字母大小写不敏感在读xml中的应用

    需要解决的问题:要匹配字符串,字符串中字母的大小写不确定,如何匹配? 问题出现之前是使用字符串比较的方式,比如要匹配'abc',则用语句: if s == 'abc':#s为需要匹配的字符串 prin ...