内存分析
内存分析:
分析的是 jvm 的内存;
jvm是虚拟机,是一台可以执行字节码文件的虚拟的机器;
jvm的资源是来自本地的硬件;
jvm默认是 64m 内存;
命令行参数;
简而言之:分析的是 jvm 的 内存,内存来自于本地;
jvm 内存分析:
内存是抽象的
虚拟机的内存,在逻辑上主要被划分为 5个部分
栈
堆
方法区
本地方法栈
程序计数器
5个部分分别介绍
栈:
每个线程都包含一个栈,多个线程就是有多个栈。多个栈之间的信息并不互通;
栈的空间相对于堆较小,运行速度要快;
程序执行到方法时,先把方法压入栈,还会储存局部变量。
方法执行完毕之后,就会回收空间。这是栈自行的清理空间,而不是 垃圾回收机制;
栈是内存中一块连续的区域;
堆:
堆只有一个,被所有线程共享。
堆的空间大,运行速度慢。堆不是连续区域;
堆主要存放对象,基本上所有对象都存储在堆里,new产生的对象肯定在堆里;
堆的内存回收和栈不同,垃圾回收机制主要的回收的是堆中的垃圾;
垃圾:指的是 无用的对象;
当堆中的对象,没有任何一个地址可以指向它的时候,他就是不可达的对象,就是垃圾;
判断对象是否可达,用的是科学分析法;
java项目一经启动,就会自动的开启 关于垃圾回收的线程,该线程是后台线程;
垃圾回收器 简称 GC;
程序员不可以命令 GC去回收垃圾,但是可以通知GC,但是GC不一定执行;
方法区:
目前方法区的认识分为两种:
1. 方法区不是堆的一部分;
2. 方法区属于堆的一部分;
方法区主要包含三个部分:
1. 存放信息的部分:存放字节码信息;
2. 静态区:存放静态元素的地方;
3. 常量池:存放常量,不是任何一个累都支持常量池技术;
String、包装类中的一部分;
目的: 减少对象的创建;
原理: 例如String
当我们创建 String str = “你好”; 时 会首先到常量池中寻找;
如果有“你好”这个字符串,那么就把地址给到 str;
如果没有这个字符创,那么就在常量池创建这个字符串对象,把地址给到str;
当我们需要创建100个“你好”时,其实只创建了一个;
普通对象不可以放到常量池中;
1. show(){
2. Person p = new Person(); //新建立的对象是垃圾;
3. p.add();
4. }
5.
6. pss = {};
7. show(Person [] ps){
8. Person p = new Person(); //新建立的对象不是垃圾
9. p.add();
10. ps[0]=p;
11. }
本地方法栈:
专门为本地方法服务;
程序计数器:
为线程之间跳转服务;