JVM那些事儿(一)——jvm内存介绍

本节小汪重点介绍下java内存,首先提问:

1.jvm内存如何分配

2.为什么要划分新生代和老年代,实践中究竟哪些属于新哪些属于旧

3.简要介绍一下jstat -gc 如何

1.jvm内存如何分配

1.1概念介绍

内存分为堆栈两部分

栈:线程私有

堆:线程共享

栈:

程序计数器:当前线程所执行的字节码行号指示器 控制代码字节的执行

java虚拟机栈:描述的是java方法执行的内存模型,方法从调用到完成就对应一个栈帧在虚拟机栈中入栈出栈的过程。

栈帧:一种数据结构 用于存储局部变量、操作数栈、动态链接、方法出口

本地方法栈:为虚拟机栈的Native方法服务

堆:

Java堆:存java对象实例

方法区(Non-Heap,永久代):常量、静态变量、类信息

运行时常量池:方法区的一部分,编译期的字面量和符号引用

1.2下面通过代码实例来加深认识

public class MyThreadPrinter2 implements Runnable {

private String name;

private Object prev;

private Object self;

private static int num = 12;

private MyThreadPrinter2(String name, Object prev, Object self) {

this.name = name;

this.prev = prev;

this.self = self;

}

@Override

public void run() {

int count = 10;

System.out.println(count);

}

public static void main(String[] args) throws Exception {

Object a = new Object();

Object c = new Object();

MyThreadPrinter2 pa = new MyThreadPrinter2("A", c, a);

new Thread(pc).start();

}

}

该代码产生了对象和线程,并执行该线程,下面分析一下当main方法执行时jvm内存情况

1.

Object a = new Object();

Object c = new Object();

Java堆里会产生两个Object对象

栈里本地变量表产生两个reference类型 a和c 分别引用了堆中的两个对象实例

2.

MyThreadPrinter2 pa = new MyThreadPrinter2("A", c, a);

Java堆中产生一个MyThreadPrinter2对象 对象中包含了name prev self这几个变量

同时静态num被保存到了方法区中

栈里本地变量表产生pa并指向MyThreadPrinter2对象

run方法信息有关的字面量会保存在方法区中

3.

new Thread(pc).start();

产生一个线程对象 并调用run方法

在栈中会针对该线程对象产生相应栈帧

4.

public void run() {

int count = 10;

System.out.println(count);

}

run方法中的本地变量表会生成一个count并赋值为10

最终该方法的运行会通过指令集对栈帧进行出栈操作并计算来完成。

2.为什么要划分新生代和老年代,实践中究竟哪些属于新哪些属于旧

从内存回收的角度 java堆分为新生代、老年代、永久代

永久代:方法区的内容放在这里

新生代:首次生成的对象或数组

老年代:首次生成的大对象或经过N次垃圾回收后仍存活的对象

每次回收老年代也会回收永久代

3.jstat gc 介绍

究竟内存如何分配的 我们可以使用jstat gc来查看

可以看到新生代有三块区域 Eden Survivor 对象首先分配到Eden 等Eden满了会进行收集然后幸存的放入Survivor

老年代Old

永久代Perm

时间: 2024-10-12 10:45:36

JVM那些事儿(一)——jvm内存介绍的相关文章

深入理解JVM虚拟机开篇:JVM介绍与知识脉络梳理

微信公众号[Java技术江湖]一位阿里 Java 工程师的技术小站.作者黄小斜,专注 Java 相关技术:SSM.SpringBoot.MySQL.分布式.中间件.集群.Linux.网络.多线程,偶尔讲点Docker.ELK,同时也分享技术干货和学习经验,致力于Java全栈开发!(关注公众号后回复”Java“即可领取 Java基础.进阶.项目和架构师等免费学习资料,更有数据库.分布式.微服务等热门技术学习视频,内容丰富,兼顾原理和实践,另外也将赠送作者原创的Java学习指南.Java程序员面试指

[转]JVM系列一:JVM内存组成及分配

原文地址:http://www.cnblogs.com/redcreen/archive/2011/05/04/2036387.html JVM系列一:JVM内存组成及分配 java内存组成介绍:堆(Heap)和非堆(Non-heap)内存 按照官方的说法:"Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配.堆是在 Java 虚拟机启动时创建的.""在JVM中堆之外的内存称为非堆内存(Non-heap memory)".可以看出JV

JVM(二)JVM内存布局

这几天我再次阅读了<深入理解Java虚拟机>之第二章"Java内存区域与内存溢出异常",同时也参考了一些网上的资料,现在把自己的一些认识和体会记录一下.  (本文为博主原创文章,转载请注明出处) 一.概述 在网上看到很多的各种文章来写Java内存布局/Java内存模型(JMM)/Java内存分配和回收等.初学者,往往容易被搞混淆,这些东西到底都是些啥?讲的是不是同一个东西?如果不是同一个东西,那它们之间又有什么区别和联系?说句实话,笔者在看到这些文章和概念时,一样是有这些疑

JVM初探- 使用堆外内存减少Full GC

JVM初探-使用堆外内存减少Full GC 标签 : JVM 问题: 大部分主流互联网企业线上Server JVM选用了CMS收集器(如Taobao.LinkedIn.Vdian), 虽然CMS可与用户线程并发GC以降低STW时间, 但它也并非十分完美, 尤其是当出现Concurrent Mode Failure由并行GC转入串行时, 将导致非常长时间的Stop The World(详细可参考JVM初探- 内存分配.GC原理与垃圾收集器). 解决: 由GCIH可以联想到: 将长期存活的对象(如L

2 - JVM随笔分类(JVM堆的内存回收)

JVM常用的回收算法是: 标记/清除算法 标记/复制算法 标记/整理算法 其中上诉三种算法都先具备,标记阶段,通过标记阶段,得到当前存活的对象,然后再将非标记的对象进行清除,而对象内存中对象的标记过程,则是使用的  “根搜索算法”,通过遍历整个堆中的GC ROOTS,将所有可到达的对象标记为存活的对象的一种方式,则是 “根搜索算法”,其中根是指的“GC ROOTS”,在JAVA中,充当GC ROOTS的对象分别有:“虚拟机栈中的引用对象”,“方法区中的类静态属性引用的对象”,“方法区中的常量引用

JVM并发机制的探讨——内存模型、内存可见性和指令重排序

[转]http://my.oschina.net/chihz/blog/58035 文章写的非常好,为作者点赞. JAVA内存模型 对于我们平时开发的业务应用来说,内存应该是访问速度最快的存储设备,对于频繁访问的数据,我们总是习惯把它们放到内存缓存中,有句话不是说么,缓存就像是清凉油,哪里有问题就抹一抹.但是CPU的运算速度比起内存的访问速度还要快几个量级,为了平衡这个差距,于是就专门为CPU引入了高速缓存,频繁使用的数据放到高速缓存当中,CPU在使用这些数据进行运算的时候就不必再去访问内存.但

JVM 系列(二)内存模型

02 JVM 系列(二)内存模型 一.JVM 内存组成 (1) PC 寄存器(线程私有) Java 虚拟机会为每个线程创建 PC 寄存器,在任意时刻,一个 java 线程总是在执行一个方法,这个方法被称为当前方法. 如果当前方法不是本地方法,PC 寄存器就会执行当前正在被执行的指令,如果是本地方法,则 PC 寄存器值为 undefined,寄存器存放如当前执行环境指针.程序计数器.操作栈指针.计算的变量指针等信息. 这个内存区域是唯一一个在虚拟机中没有规定任何 OutOfMemoryError

性能测试三十六:内存溢出和JVM常见参数及JVM参数调优

堆内存溢出: 此种溢出,加内存只能缓解问题,不能根除问题,需优化代码堆内存中存在大量对象,这些对象都有被引用,当所有对象占用空间达到堆内存的最大值,就会出现内存溢出OutOfMemory:Java heap space 永久代溢出 如果发生,则是在初始化的时候,空间太小,解决办法,扩大空间类的一些信息,如类名.访问修饰符.字段描述.方法描述等,所占空间大于永久代最大值,就会出现OutOfMemoryError:PermGen space 内存溢出的检测方法:pid=1730 Jdk/bin目录下

JVM中的本机内存跟踪

1.概述 有没有想过为什么Java应用程序通过众所周知的-Xms和-Xmx调优标志消耗的内存比指定数量多得多?出于各种原因和可能的优化,JVM可以分配额外的本机内存.这些额外的分配最终会使消耗的内存超出-Xmx限制. 在本教程中,我们将列举JVM中的一些常见内存分配源,以及它们的大小调整标志,然后学习如何使用本机内存跟踪监视它们. 2.原生分配 堆通常是Java应用程序中最大的内存使用者,但还有其他人.除了堆之外,JVM还从本机内存中分配出一个相当大的块来维护类的元数据,应用程序代码,JIT生成

JVM虚拟机-03、JVM内存分配机制与垃圾回收算法

JVM虚拟机-03.JVM内存分配机制与垃圾回收算法 1 JVM内存分配与回收 1.1 对象优先在Eden区分配 大多数情况下,对象在新生代中?Eden?区分配.当?Eden?区没有足够空间进行分配时,虚拟机将发起一次Minor?GC.我们来进行实际测试一下.在测试之前我们先来看看?Minor?GC和Full?GC?有什么不同呢? Minor?GC/Young?GC:指发生新生代的的垃圾收集动作,MinorGC非常频繁,回收速度一般也比较快. Major?GC/Full?GC:一般会回收老年代,