Jdk:Java程序设计语言、Java虚拟机、Java API类库。

Jdk是用于支持Java程序开发的最小环境。

Jre:Java API类库中的Java SE API子集、Java虚拟机。

Jre是支持Java程序运行的标准环境。

Program Counter Register:较小的内存空间,可以看作当前线程所执行的字节码的行号指示器。是唯一一个Java虚拟机规范中没有规定OutOfMemoryError的区域。

VM Stack:生命周期和线程相同,它描述了Java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息。

两种异常:StackOverflowError、OutOfMemoryError

Native Method Stack:类似VM Stack,且Sun HotSpot直接合二为一!

Heap:最大的一块内存,虚拟机启动时创建,唯一目的就是存放对象实例的。

Method Area:存储已被虚拟机加载的类信息、常量、静态变量、即使编译器编译后的代码等数据。Java虚拟机规范称其为堆的逻辑部分,别名却叫Non-Heap(非堆),或永久代

Runtime Constant Pool:方法区的一部分

Direcrt Memory:不是虚拟机运行时数据区的一部分,也不是虚拟机规范定义的内存区域。

对象的创建—关键字new

内存划分方法:指针碰撞(堆内存规整,通过移动指针分配内存)、空闲列表(堆内存不规整,通过更新内存列表分配内存)。

TLAB(Thread Local Allocation Buffer):本地线程分配缓冲,对于所创建的线程都会分配一块独立的空间,避免内存分配冲突,提升内存分配效率。

对象的内存布局:对象头(Header)、实例数据(Instance Data)和对其填充(Padding)。

对象的访问定位:Java程序通过栈上的reference(引用)数据来操作堆上的具体对象。

  方式:句柄和直接指针(Sun HotSpot)。

OutOfMemoryError异常实战

工具:Eclipse Memory Analyzer

内存泄漏Memory Leak、内存溢出Memory Overflow

判断对象是否死亡—堆内存

1、引用计数算法:给对象添加一个引用计数器,每当有一个地方引用它是,计数器加1;当引用失效时,计数器减1;任何时刻计数器为0的对象就是不可能再被使用的。

2、可达性分析算法:通过“GC Roots”对象作为起始点向下搜索,当一个对象到GC Roots没有任何引用链相连,证明此对象是不可用的。

To be or not to be!

1、 使用上述算法判断对象是否使用;

2、 如果不再被使用,则标记并筛选;

    刷选是否有必要执行finalize()方法,如下情况不需要执行:

    l 对象没覆盖finalize()方法;

    l finalize()方法已经被虚拟机调用过;

3、 如果有必要执行,则把该对象放置在F-Queue队列中;

4、 由一个虚拟机自动建立、低优先级的Finalizer线程去执行它,即由虚拟机来触发执行;

5、 GC对队列中的对象会进行第二次标记,即给对象重新建立引用,就能移除回收集合;

注意:任何一个对象的finalize()方法都只会被系统调用一次!

方法区回收

主要两部分:废弃常量和无用的类

控制参数

-Xnoclassgc:关闭虚拟机对class的垃圾回收功能;

-verbose:class:监视有多少类被加载;

-XX:TraceClassLoading、-XX:TraceClassUnLoading:打印类被加载和卸载的过程信息;

注意:在大量使用反射、动态代理、CGLib等ByteCode框架、动态生成JSP以及OSGI这类频繁自定义ClassLoader的场景都需要虚拟机具备类卸载的功能,以保证永久代不会溢出!

垃圾收集算法

1、标记—清除算法:容易产生内存碎片

2、复制算法:堆被划分成两个不同的区域:新生代(Young) 主要是用来存放新生的对象、老年代(Old) 主要存放应用程序中生命周期长的内存对象。新生代 (Young)又被划分为三个区域:Eden、From Survivor、To Survivor。

默认的,新生代(Young)与老年代(Old)的比例的值为1:2

默认的,Edem : from : to = 8 : 1 : 1

3、标记—整理算法

4、分代收集算法

HotSpot算法实现GC

枚举根节点:逐个检查;(Stop The World,GC执行时必须停顿所有Java执行线程)

在OopMap协助下,HotSpot可以快速并准确地完成枚举。

安全点:只有在安全点才能停顿开始GC

安全区域:安全点的扩展,在安全区域可以停顿开始GC

垃圾收集器:内存回收的具体实现。

GC日志

GC常用参数

内存分配策略

1、对象优先在Eden分配:新生代GC(Minor GC)、老年代GC(Major GC/Full GC)

2、大对象直接进入老年代:

3、长期存活的对象将进入老年代:给每个对象定义一个年龄(Age)计数器。对象在Eden出生并经过第一次Minor GC后仍然存活,并且能被Survicor容纳的话,将被移动到Survivor空间,并对象年龄设为1。对象在Survivor中每“熬过”一次Minor GC,年龄就增加1,当年龄增加到一定程度(默认15),晋升到老年代中。

4、动态对象年龄判定:虚拟机并不是永远要求对象年龄到一定程度才能晋升老年代,如果在Survivor空间中相同年龄所有对象大小总和大于Survivor空间的一半,年龄大于或等于该年龄的对象就可以直接进入老年代。

5、空间分配担保:老年代的连续空间大于新生代对象总大小或者历次晋升的平均大小就会进行Minor GC,否则将进行Full GC。

工具

JDK1.5中,getAllStackTraces()用于获取虚拟机中所有线程的StackTraceElement对象。

HSDIS:JIT生成代码反汇编。

JConsole:Java监视与管理控制平台,基于JMX。

VisualVM:多合一故障处理工具

Java虚拟机内存管理原理基础入门的更多相关文章

  1. (三)java虚拟机内存管理和线程独占区和线程共享区

    一.内存管理 二.线程独占区之程序计数器(Program Counter Register) 程序计数器是一块较小的内存空间,它可以看做是当前线程所执行的字节码的行号指示器.在虚拟机的概念模型里,字节 ...

  2. java虚拟机内存管理

    1. java虚拟机内存如下 2. 运行时数据区 内存图分析:

  3. Java虚拟机内存管理机制

    自动内存管理机制 Java虚拟机(JVM)在执行Java程序过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有的区 ...

  4. 深入理解java虚拟机---java虚拟机内存管理(七)

    本地方法栈.java堆.方法区 本地方法栈在HotSpot版本内与java虚拟机栈是合二为一的.不单独区分本地方法栈.但是java虚拟机中是有这样一块区域的. 作用: 1.本地方法栈为虚拟机栈执行ja ...

  5. 探秘Java虚拟机——内存管理与垃圾回收

    本文主要是基于Sun JDK 1.6 Garbage Collector(作者:毕玄)的整理与总结,原文请读者在网上搜索. 1.Java虚拟机运行时的数据区 2.常用的内存区域调节参数 -Xms:初始 ...

  6. 探秘Java虚拟机——内存管理与垃圾回收(转)

    本文主要是基于Sun JDK 1.6 Garbage Collector(作者:毕玄)的整理与总结,原文请读者在网上搜索. 1.Java虚拟机运行时的数据区 2.常用的内存区域调节参数 -Xms:初始 ...

  7. 深入理解Java虚拟机—内存管理机制

    前面说过了类的加载机制,里面讲到了类的初始化中时用到了一部分内存管理的知识,这里让我们来看下Java虚拟机是如何管理内存的. 先让我们来看张图 有些文章中对线程隔离区还称之为线程独占区,其实是一个意思 ...

  8. 深入理解java虚拟机---java虚拟机内存管理(六)

    java虚拟机栈的理解 虚拟机栈就是我们所熟知的栈内存,栈内存属于线程独有的.而在栈内存中的局部变量表中存储的引用类型只是存储对象的内存地址.对象的创建在堆内存中,即对象在线程共享区中. 局部变量表: ...

  9. 深入理解java虚拟机---java虚拟机内存管理(五)

    1.深入理解java虚拟机 总图: 1.线程共享区: 2.线程独占区: 1.程序计数器 理解为当前线程锁执行的字节码的行号指示器,程序计数器没有内存异常错误.

随机推荐

  1. C#的变迁史 - C# 4.0篇

    C# 4.0 (.NET 4.0, VS2010) 第四代C#借鉴了动态语言的特性,搞出了动态语言运行时,真的是全面向“高大上”靠齐啊. 1. DLR动态语言运行时 C#作为静态语言,它需要编译以后运 ...

  2. ASP.NET MVC 网站开发总结(二)——一个或多个文件的异步或同步上传

    简而言之,直接用代码展示如何实现文件的上传,这里需要使用到一个bootstrap的文件上传插件File Input(请自行下载). 前台页面: <!----> <!DOCTYPE h ...

  3. 去掉Mybatis Generator生成的一堆 example

    <table tableName="%" enableInsert="true" enableDeleteByPrimaryKey="true& ...

  4. python不用加号实现加法

    问题: Calculate the sum of two integers a and b, but you are not allowed to use the operator + and -.E ...

  5. spring的使用《一》

    在前边的文章中说明了,如何搭建一个spring的开发环境,简单回顾下就是把spring的jar包导入工程中,如果是在javaWeb项目中是放在lib目录下,然后在web.xml文件中进行配置,配置sp ...

  6. CentOS 6.5 搭建 LAMP 环境

    目录 第一步: 安装和配置Apache服务器 第二步: 设置.绑定站点目录文件 第三步: 安装MYSQL数据库 第四步: 安装PHP环境 总结 >>Begin: 第一步: 安装和配置Apa ...

  7. Mysql新增用户,权限管理

    MySQL 赋予用户权限命令的简单格式可概括为:grant 权限 on 数据库对象 to 用户 一.grant 普通数据用户,查询.插入.更新.删除 数据库中所有表数据的权利. grant selec ...

  8. Asp.net SignalR 实现服务端消息推送到Web端

              之前的文章介绍过Asp.net SignalR,  ASP .NET SignalR是一个ASP .NET 下的类库,可以在ASP .NET 的Web项目中实现实时通信.  今天我 ...

  9. java顺序表和树的实现

    一.顺序表 1.线性表 //java顺序表的实现,如ArrayList就是用线性表实现的,优点是查找快,缺点是添加或删除要移动很多元素,速度慢 public class SequenceList { ...

  10. 使用Apache的DigestUtils类实现哈希摘要(SHA/MD5)

    包名称:org.apache.commons.codec.digest 类名称:org.apache.commons.codec.digest.DigestUtils 1.MD5 public sta ...