月初的时候个人网站到期了,不想再折腾重新建站了,以后还是来第三方博客写文章吧,可以省去很多问题。之前写的文章也不是很多,备份懒得做了,从头开始吧。博文仅仅是用来记录和学习总结,如有错误之处请帮忙指正!

今天想说说JVM内存结构的问题,说到JVM大家肯定首先想到的是栈和堆。的确,这两块说是JVM内存结构最重要的部分也不为过。先来简单介绍一下吧,

内存结构按照私有和共享划分方式如下:

线程私有:栈区、本地方法栈、程序计数器

线程共享:堆区、方法区

其他不说了,重点说说栈和堆


栈:

栈的特点就是快。每个线程对应一个栈,每个栈含有1个或多个栈帧,栈帧用来存放方法的局部变量表、操作数栈、动态链接、returnAddress等信息,每运行一个方法就会创建一个栈帧,从方法运行到结束对应着栈帧在栈区里面入栈和出栈的过程。

局部变量表包含两类数据结构,一是八大基本类型,byte short int long float double char boolean; 第二类是reference类型,占用空间是4byte,不管是对象是大是小,操控它仅需要用一个4byte的变量即可,而且可以按需销毁,这足以体现栈堆分离的好处。

栈空间是可以重复利用的,遇到左括号入栈,遇到右括号出栈,我们当系统进行递归调用时,系统会连续多次执行入栈操作,直到最深处才执行出栈操作,这就可能导致栈空间不足,StackOverFlowError异常,因此遇到该异常一般不是对象太大导致的,多是因为不正确递归或栈空间不足以容纳导致。在栈区还可能会遇到OOM异常,当线程过多时或分配空间过小时,如果无法申请到足够内存时,便会报OOM异常(栈区OOM异常的原因暂不确定也为遇见过,只是周志明JVM书中提到栈区OOM异常,上网也未查到)。JVM调优:通过-Xss来控制栈空间大小。


堆:

堆是JVM内存中最大的一块,是用来为对象和数组元素分配空间的地方,而对象的引用变量和数组引用都是在栈中存放的。“几乎所有的对象都在这里创建”,那么什么情况下对象不在堆中创建呢?随着JIT编译器的发展,在编译期间,如果JIT经逃逸分析后发现对象没有逃逸出方法,那么该对象坑会在栈上分配内存而不是堆,但是也不绝对。测试:为JVM分配足够空间,关闭逃逸分析,创建一百万个User对象,jmap命令发现堆中创建了一百万个对象,开启逃逸分析,发现堆中的对象变成了八万个,也就是说JIT编译器确实会将对象分配在栈里,但并不绝对。

使用逃逸分析,编译器可以针对分析结果做以下优化:

1、同步省略(锁消除优化):如果一个对象被发现只能被一个线程访问,那么可以不考虑该对象的同步;

2、栈上分配对象;如果一个对象在子程序中被分配,要是指向该对象的指针永远不会逃逸,对象可能会在栈中被分配,而不是在堆中;

3、分离对象或标量替换:有的对象可能不需要连续的内存结构,可以将该对象的部分或全部存储到CPU的寄存器中。

逃逸分析:-XX:+/-DoEscapeAnalysis

关于堆的分代和垃圾收集下次再讲。


顺带讲一下,参数传递的时候,Java是传值还是传引用?这个问题相信每个程序员都会思考过,也肯定遇到过由此引发的问题。

要说明这个问题,首先要说明两点:一是不要和C语言类比,Java没有指针的概念;二是程序运行永远都是在栈中进行,因而参数传递时涉及到的只会是基本数据类型和引用类型,理论上来说不会涉及到对象本身。而Java中没有指针的概念,因此Java可以说是传值调用,当参数是引用类型时传递的是引用变量的值;但是当进入被调用方法时,被传递的这个引用的值,被程序解释(或者查找)到堆中的对象,这个时候才对应到真正的对象,这个时候如果对其进行修改,修改的并不是引用本身,而是对象的属性,所以对对象的修改会保持。程序参数传递时,被传递的值本身都是不能进行修改的,但是,如果这个值是一个引用,则可以修改这个引用背后的东西。

JVM内存结构解析的更多相关文章

  1. 管中窥豹——从对象的生命周期梳理JVM内存结构、GC调优、类加载、AOP编程及性能监控

    如题,本文的宗旨既是透过对象的生命周期,来梳理JVM内存结构及GC相关知识,并辅以AOP及双亲委派机制原理,学习不仅仅是海绵式的吸收学习,还需要自己去分析why,加深对技术的理解和认知,祝大家早日走上 ...

  2. JVM内存结构,运行机制

    三月十号,白天出去有事情出去了一天,晚上刚到食堂就接到阿里电话, 紧张到不行,很多基础的问题都不知道从哪里说了orz: 其中关于JVM内存结构,运行机制,自己笔记里面有总结的,可当天还是一下子说不出来 ...

  3. JVM内存结构 JVM的类加载机制

    JVM内存结构: 1.java虚拟机栈:存放的是对象的引用(指针)和局部变量 2.程序计数器:每个线程都有一个程序计数器,跟踪代码运行到哪个位置了 3.堆:对象.数组 4.方法区:字节流(字节码文件) ...

  4. JVM入门——JVM内存结构

    一.java代码编译执行过程 1.源码编译:通过Java源码编译器将Java代码编译成JVM字节码(.class文件) 2.类加载:通过ClassLoader及其子类来完成JVM的类加载 3.类执行: ...

  5. JVM(七):JVM内存结构

    JVM(七):JVM内存结构 在前几节的文章我们多次讲到 Class 对象需要分配入 JVM 内存,并在 JVM 内存中执行 Java 代码,完成对象内存的分配.执行.回收等操作,因此,如今让我们来走 ...

  6. 万万没想到,JVM内存结构的面试题可以问的这么难?

    在我的博客中,之前有很多文章介绍过JVM内存结构,相信很多看多我文章的朋友对这部分知识都有一定的了解了. 那么,请大家尝试着回答一下以下问题: 1.JVM管理的内存结构是怎样的? 2.不同的虚拟机在实 ...

  7. Java 内存模型和 JVM 内存结构真不是一回事

    这两个概念估计有不少人会混淆,它们都可以说是 JVM 规范的一部分,但真不是一回事!它们描述和解决的是不同问题,简单来说, Java 内存模型,描述的是多线程允许的行为 JVM 内存结构,描述的是线程 ...

  8. JDK8的JVM内存结构,元空间替代永久代成为方法区及常量池的变化

    JVM的知识这里总结的很详细:https://github.com/doocs/jvm/blob/master/README.md,因此在本博客也不会再对其中的东西重复总结了. 现在很多文章关于JVM ...

  9. JVM内存结构划分

    JVM内存结构划分 JVM内存结构划分 数据区域划分 程序计数器 虚拟机栈 本地方法栈 堆 方法区 运行时常量池 StringTable 直接内存 创建新对象说明 对象的创建 对象的内存布局 对象头 ...

随机推荐

  1. WPF——TargetNullValue(如何在绑定空值显示默认字符)

    原文:WPF--TargetNullValue(如何在绑定空值显示默认字符) 说明:在数据绑定时,如果有些字段为空值,那么在数据绑定时可以用默认值来显示为空的字段. </Grid> { L ...

  2. Kali Linux安装TL-WN821N USB无线网卡驱动(make失败)

    主要有下面几个步骤: 1.刚插上网卡,network-manager识别出来了网卡,也能搜索到WiFi,但就是连接不上.查看/var/log/syslog日志或者使用nmcli m查看网络信息,显示认 ...

  3. 迁移到MSYS2 与 Qt 工具链注意的几个事情(g++在链接时,符号依赖项查找遵循从左至右的顺序,但qmake会自动合并造成错误。使用脚本给Mingw32-make创造出一个局部的VC编译环境)

    Microsoft Visual Studio 2015社区版提供了强大的开发体验,且 Qt 提供了预编译版本.然而,由于客户提出兼容Windows XP ~ Windows 8.1 这样宽泛的环境要 ...

  4. Qt 访问网络的 HttpClient(封装QNetworkAccessManager,且有服务端)

    Qt 使用 QNetworkAccessManager 访问网络,这里对其进行了简单的封装,访问网络的代码可以简化为: 1 2 3 HttpClient("http://localhost: ...

  5. 树莓派中安装QT

    树莓派中安装QT 本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明. 环境: 主机:WIN7 硬件:树莓派 步骤: 参考链接:http://qt-proje ...

  6. iOS密码框的实现方式

    说一下密码加密的实现方式   效果图:           实现方式:   主要说一下密码框的实现,这个密码框中间的四个数字其实是4个 UITextField ,然后通过键盘删除键 和TextFile ...

  7. 关于这次KPL春季决赛的感悟

    QG 4:0 横扫AG超玩会,关于这一点想写一些自己的感悟,AG超玩会一直都是 4:0 横扫别人,这次在冠军赛被别人横扫,一点喘息的机会都没有.   1.QGhappy 跟本没把AG超玩会放在眼里,很 ...

  8. BDC

    TC:SHDB 复制到应用处并更改参数. 附上部分代码 *       Batchinputdata of single transaction DATA:   bdcdata LIKE bdcdat ...

  9. Rails.cache相关知识

    可能里面的一些知识已经不被大家使用了,但是作为学习,我想和大家分享一下个人关于Rails.cache的浅显的认识,望大家指教. 1.Rails.cache是什么 它是Rails中的缓存,拥有所有缓存的 ...

  10. rm、shutdown、磁盘挂载、vi使用方法

    1. 系统管理文件 1.1 rm 文件与目录有关命令 删除命令 (慎用)    --- 数据是否备份了 rm === remove rm /oldboy/oldboy.txt  --- 删除文件 rm ...