不得不看的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中将变量存储到内存和从内存中取 ...
随机推荐
- python手记(39)
#!/usr/bin/env python #-*- coding: utf-8 -*- #code:myhaspl@qq.com import cv2 import numpy as np fn=& ...
- Android 之窗口小部件详解(三) 部分转载
原文地址:http://blog.csdn.net/iefreer/article/details/4626274. (一) 应用程序窗口小部件App Widgets 应用程序窗口小部件(Widget ...
- hdu 1695 GCD(欧拉函数+容斥)
Problem Description Given 5 integers: a, b, c, d, k, you're to find x in a...b, y in c...d that GCD( ...
- OC 图片圆角实现
self.imageTouX.layer.masksToBounds=YES; self.imageTouX.layer.cornerRadius=/2.0f; //设置为图片宽度的一半出来为圆形 s ...
- C语言的学习-基础知识点
---BOOL BOOL BOOL a = YES; printf("%d\n", a); a = NO; printf("%d", a); , b = ; B ...
- Linux 时间同步配置(转)
一. 使用ntpdate 命令 1.1 服务器可链接外网时 # crontab -e 加入一行: */1 * * * * ntpdate 210.72.145.44 210.72.145.44 为中国 ...
- UIWindow in iOS
这篇文章,我将分享对UIWindow我所知道的东西. keyWindow 一个应用能够有许多UIWindow,“The key window”是其中一个,被设计用来接受键盘和其他与点击无关的事件.一个 ...
- asp Eval()函数的一些使用总结
一.函数的原型: Eval(string s); s可以是变量,表达式,语句: 二.使用: 1.s为变量时,返回该变量的值,如:string s = "sss";Eval(s);/ ...
- FineUI按钮控件
按钮的状态与大小 按钮有启用/禁用,按下/正常几种状态,对应的属性分别为Enabled.EnablePress.Pressed三个属性. 按钮有大中小三个尺寸,对应的属性为Size. 按钮上的图标 按 ...
- C++中的虚函数
代码: #include <iostream> #include <cstring> using namespace std; class Base{ public: virt ...