不得不看的JVM内存管理
作为一个任何完整的机器都会有内存管理这块组成结构。作为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内存管理的更多相关文章
- Java之美[从菜鸟到高手演变]之JVM内存管理及垃圾回收
很多Java面试的时候,都会问到有关Java垃圾回收的问题,提到垃圾回收肯定要涉及到JVM内存管理机制,Java语言的执行效率一直被C.C++程序员所嘲笑,其实,事实就是这样,Java在执行效率方面确 ...
- JVM内存管理及垃圾回收【转】
很多Java面试的时候,都会问到有关Java垃圾回收的问题,提到垃圾回收肯定要涉及到JVM内存管理机制,Java语言的执行效率一直被C.C++程序员所嘲笑,其实,事实就是这样,Java在执行效率方面确 ...
- JVM内存管理及垃圾回收
一.JVM内存的构 Java虚拟机会将内存分为几个不同的管理区,这些区域各自有各自的用途,根据不同的特点,承担不同的任务以及在垃圾回收时运用不同的算法.总体分为下面几个部分: 程序计数器(Progra ...
- 现代JVM内存管理方法的发展历程,GC的实现及相关设计概述(转)
JVM区域总体分两类,heap区和非heap区.heap区又分:Eden Space(伊甸园).Survivor Space(幸存者区).Tenured Gen(老年代-养老区). 非heap区又分: ...
- java虚拟机学习-JVM内存管理:深入垃圾收集器与内存分配策略(4)
Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来. 概述: 说起垃圾收集(Garbage Collection,下文简称GC),大部分人都把这项 ...
- java虚拟机学习-JVM内存管理:深入Java内存区域与OOM(3)
概述 Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来. 对于从事C.C++程序开发的开发人员来说,在内存管理领域,他们即是拥有最高权力的皇帝又 ...
- Java的内存 -JVM 内存管理
一.综述 如果你学过C或者C++,那么你应该感受过它们对内存那种强大的掌控力.但是强大的能力往往需要更强大的控制力才能保证能力不被滥用,如果滥用C/C++的内存管理那么很容易出现指针满天飞的情况,不出 ...
- JVM内存管理及GC机制
一.概述 Java GC(Garbage Collection,垃圾收集,垃圾回收)机制,是Java与C++/C的主要区别之一,作为Java开发者,一般不需要专门编写内存回收和垃圾清理代码,对内存泄露 ...
- Java内存模型和JVM内存管理
Java内存模型和JVM内存管理 一.Java内存模型: 1.主内存和工作内存(即是本地内存): Java内存模型的主要目标是定义程序中各个变量的访问规则,即在JVM中将变量存储到内存和从内存中取 ...
随机推荐
- 论 <%@taglib prefix="s" uri="/struts-tags" %> 的重要性
前段时间在做项目的时候,碰到这个问题 结果是相应的内容显示不出来,原来是忘了这句很关键的引入:<%@taglib prefix="s" uri="/struts-t ...
- MVC 区域模块
mvc4.0新增的area区域机制,可以协助你在架构较为大型的项目,让独立性较高的部分功能独立成一个MVC子网站,以降低网站与网站之间的耦合性,也可以通过area的切割,让多人同时开发同一个项目时候, ...
- python使用一个集合代替列表
"""说明:对于一个指定的序列,如果需要获得一个只包含该序列中不重复的序列时,使用以下算法:"""seq=['a','a','b','c', ...
- 大话分页(补充)——Threadlocal封装offSet和pageSize简化分页工具类
经过前两篇文章(大话分页一.大话分页二)的介绍,我认为我想介绍的东西已经介绍完了,不过想精益求精的童鞋可以继续看本篇文章. 在第一篇文章中介绍了一个分页的工具类(具体请看大话分页一),从实现功能上来说 ...
- Java反射举例
本文參考:http://www.cnblogs.com/yydcdut/p/3845430.html 1.Java反射的基本介绍 Java的反射很强大,传递class. 能够动态的生成该类.取得这个类 ...
- QtWebkit2.2.0 HTML5.0支持情况
Canvas: 支持element, 2d context以及文本 解析规则:支持 HTML5 tokenizer/tree building, SVG in text/html, MathML ...
- CSS基础知识笔记(三)
继承 继承是一种规则,它允许样式不仅应用于某个特定html标签元素,而且应用于其后代.比如下面代码:如某种颜色应用于p标签,这个颜色设置不仅应用p标签,还应用于p标签中的所有子元素文本,这里子元素为s ...
- C#编写Windows服务程序图文教程(转载)
Windows Service这一块并不复杂,但是注意事项太多了,网上资料也很凌乱,偶尔自己写也会丢三落四的.所以本文也就产生了,本文不会写复杂的东西,完全以基础应用的需求来写,所以不会对Window ...
- iOS_SN_BlueTooth (二)iOS 连接外设的代码实现
原文:http://www.cocoachina.com/ios/20150917/13456.html?utm_source=tuicool&utm_medium=referral 上一篇文 ...
- Struts2 技术全总结 (正在更新)
背景:Struts1是一个高度成熟的框架,运行效率高,但其致命缺陷在于与JSP/Servlet的耦合非常紧密,因而导致了一些严重问题.其次,Struts1与Servlet API的严重耦合,使应用难以 ...