不得不看的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中将变量存储到内存和从内存中取 ...
随机推荐
- c语言结构体1之定义
这是在复习阶段随便小结的一些东西 别喷哦 结构体定义的三种方式 注意事项: 1结构体括号后面有分号 2#define得放在程序上面 3成员名可以和结构体名相同 4结构体类型不能直接访问成员,也不能赋值 ...
- 关于ognl.OgnlException: target is null for setProperty(null的解决方案
在跑struts2的时候有时候会出现上面的错,特别是新手, 这种情况是在struts2高级的POJO访问时候出现的s 警告: Error setting expression 'user.passwo ...
- 我所理解的设计模式(C++实现)——中介者模式(Mediator Pattern)
概述: 假设我们开发一个图片处理软件,里面肯定包括很多相关功能,比如说剪切,旋转,滤镜,美化等等,而我们这些功能所要处理的对象是固定的,就是我们所显示的那张图片.但是我们不能把所有的功能罗列到一个ta ...
- Eclipse+Java+OpenCV246人脸识别
1.环境搭建:见上一篇博客 整个项目的结构图: 2.编写DetectFaceDemo.java,代码如下: package com.njupt.zhb.test; import org.opencv. ...
- Microsoft Dynamics CRM 2016 增强版的解决方案(CRM新特性,开发者的福利)
CRM在以前的版本中,如果你改变了一个字段(组织A)然后打算导入到其他组织(组织B),你必须创建一个解决方案,包括完整的实体,并导出导入.然而,如果其他团队成员正在相同的实体做了自定义但不想让这些变化 ...
- EF数据存贮问题二之“无法定义这两个对象之间的关系,因为它们附加到不同的 ObjectContext 对象”
“无法定义这两个对象之间的关系,因为它们附加到不同的 ObjectContext 对象”,这是在EF中,一对多关系表,有外键的类保存至数据库中出现的错误. 我原来是用JAVA开发的,习惯性的处理一对多 ...
- 工程与科学数值方法的Matlab实现
%stats.m function [mean,stdev]=stats(x) n=length(x);mean=sum(x)/n;stdev=sqrt(sum((x-mean).^2/(n-1))) ...
- oracle学习笔记(三)oracle函数
--oracle 函数 --lower(char):将字符串转换为小写格式 --upper(char):将字符串转换为大写格式 --length(char):返回字符串的长度 --substr(cha ...
- mysql对GIS空间数据的支持,包括创建空间索引
CREATE TABLE tb_geo( id INT PRIMARY KEY AUTO_INCREMENT, NAME ) NOT NULL, pnt POINT NOT NULL, SPATIAL ...
- VC连接数据库方式
转自:http://www.cnblogs.com/renyuan/archive/2012/07/27/2612412.html 目前Windows系统上常见的数据库接口包括: ODBC(开放数据库 ...