前言

Java启动后作为一个进程运行在操作系统中,该进程要分配的内存有以下几个:

1、Java堆:

存储java内存区域,堆大小是在jvm启动时就像操作系统申请完成,其中 -Xmx和-Xms 分别表示了最大大小和初始大小。堆大小分配完成后就已经固定并属于java的gc管理。

2、线程:

jvm运行的实际程序的实体是线程,jvm在创建线程会为其分配一个堆栈大小。如果线程数大于了CPU的核数就会导致高内存和低效率。

3、类和类加载器:在堆的永久代保存了类和类加载器,同样他们本身需要占用内存。

4、NIO:

java1.4后面出现了NIO类库,一种基于通道和缓冲来执行IO的新方式,主要使用了java.io.ByteFuffer的allocateDirect()方法去分配内存。区别于传统io,该方式网络或者磁盘的数据交互都是直接在操作系统的内核空间直接发生,免去了拷贝到jvm空间和java堆上切换的耗时。

5、JNI:

java本地语言调用,实际上java运行时,诸如文件、网络、io或者其他的硬件调用都需要用到jni,所以jni也是需要占用内存。

JVM内存结构

  • PC寄存器 (线程私有) 线程执行的行号指示器
  • java虚拟机栈(线程私有)java方法执行的内存模型
  • java堆 (线程共享)垃圾堆
  • 方法区 (线程共享 ,永久代) ,类信息、常量、静态变量、编译后的代码等数据,虚拟机规范中堆的逻辑部分,别名Non-Heap(非堆)用以区分
  • 本地方法区 (native方法)为jvm执行Native方法服务
  • 运行时常量池(字面量 符号)ps:了解下String.inter()方法

java堆上面对象的分配、布局和访问

1、对象的创建(就普通java对象而言)

  • 类检查过程:常量池检查是否有该类的符号引用,该符号代表的类是否被加载、解析和初始化过。 没有就执行 类加载过程。
  • 为新生对象分配内存:假设java堆内存分为一边是空闲另一边是已用内存区域,那么将指针向空闲空间挪动一段跟新生对象大小相等距离,这种方式就被称作为“指针碰撞(bump to Pointer)” 。如果不是规整的内存区域,JVM就必须维护一个列表,该列表记录着空闲内存块,分配时就从改表找一块足够打的内存划分给对象实例并更新该表记录,这种方式就被称为“空闲列表(Free List)”。因此,Serial、ParNew等带有compact过程的收集器,系统采用是指针碰撞,而CMS这种基于Mark-Sweep算法收集器就是采用空闲列表分配。这个分配内存过程中,由于对象创建十分的频繁导致线程安全。于是有2中解决方案,其一是CAS失败重试保证原子性操作,其二是本地线程缓冲(Tread Local Allocation Buffer,TLAB),分配内存按照线程划分的不同私有空间上进行。虚拟机是否用TLAB 通过 -xx:+/-UseTLAB参数设定。
  • 已分配内存初始化为零值。保证了实例字段可以直接使用。
  • 最后虚拟机进行对象设置,该对象属于按个类,类的元数据信息,对象的哈希码,对象的GC分代年龄等。这些信息都保存在对象头中。
  • 上述步骤在虚拟机视角看是执行完new后一个新对象已经产生,但是在程序上来看还需要执行一个 init方法后才算一个能真正被程序员所用的 java对象。

2、对象的内存布局

  • 对象头:非固定数据结构尽可能小的可复用存储空间。包含hashcode、GC年代分类等。
  • 实例数据:对象有效信息包含,子类定义和继承父类的。
  • 对齐填充:HotSpot VM自动内存管理要求对象起始地址必须是8字节的整数倍。

3、对象的访问

主要分为了句柄访问和直接指针,Sun HotSpot采用直接指针访问。如下图:

OutOfMemory

堆溢出

虚拟机栈和本地方法溢出

方法区和运行时常量溢出

本机直接内存溢出

Java Web 深入分析(11) JVM(1)的更多相关文章

  1. Java Web 深入分析(6) Tomcat

    tomcat是什么:汤姆猫?Javaweb服务器? Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache ...

  2. Java Web 深入分析(11) JVM 体系结构与工作方式

    jvm体系 jvm简介 java virtual machine jvm体系详解 jvm工作机制 虚拟机怎么执行代码 jvm为何基于栈 执行引擎 执行引擎过程 java调用栈 总结

  3. Java Web 深入分析(12) JVM(2) 垃圾收集与内存分配

    前言 java的内存分配和垃圾回收往往是影响系统性能和并发能力的主要因素,虚拟机提供许多的参数就是为了根据不同环境和请教下进行调优,没有最好的调优也没有固定的调优.需要我们深入的去了解jvm的各个垃圾 ...

  4. Java Web 深入分析(8) Servlet工作原理解析

    Servlet Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,主要功能在于交互式地浏览和修改数据,生成动态We ...

  5. Java Web 深入分析(7) Jetty原理解析

    1Jetty的基本架构 Jetty有一个基本的数据模型,这个模式就是handle,所有拷贝拓展的组件都被当做一个handler被添加到server中,然后由jetty统一管理. 1.1Jetty基本架 ...

  6. Java Web 深入分析(5) Java ClassLoader 工作机制

    Classloader 有3个作用 将class加载到JVM中去 审查每个类由谁去加载,是一种父优先的等级加载 把Class字节码统一编译成JVM统一要求的对象格式 ClassLoader的等级加载机 ...

  7. Java Web 深入分析(4) Java IO 深入分析

    I/O问题可以说是现在海量数据时代下 ,I/O大部分web系统的瓶颈.我们要了解的java I/O(后面简称为(IO)) IO类库的基本结构 磁盘IO的工作机制 网络IO的工作机制 NIO的工作方式 ...

  8. Java Web 深入分析(10) Spring 实践

    Spring helloworld [http://wiki.jikexueyuan.com/project/spring/hello-world-example.html] HelloWorld.j ...

  9. Java Web 深入分析(9) Session 和 Cookie

    前言: session 和cookie都是为了保持服务器和客户端之间交互状态.如果一天的PV有几亿,而一个cookie占200个字节但是也会占用很多带宽?所以大访问量就引用session,但是几百台服 ...

随机推荐

  1. Beta冲刺(4/5)

    队名:無駄無駄 组长博客 作业博客 组员情况 张越洋 过去两天完成了哪些任务 讨论校园百科究竟如何实现,并分配了任务 提交记录(全组共用) 接下来的计划 加快校园百科的进度 准备Beta版本的汇报 还 ...

  2. gitlab备份恢复

    1.Gitlab 创建备份1.1 创建备份文件 首先我们得把老服务器上的Gitlab整体备份,使用Gitlab一键安装包安装Gitlab非常简单, 同样的备份恢复与迁移也非常简单. 使用一条命令即可创 ...

  3. Linux 中 cp 命令(文件复制)

    cp命令用来将一个或多个源文件或者目录复制到指定的目的文件或目录.它可以将单个源文件复制成一个指定文件名的具体的文件或一个已经存在的目录下.cp命令还支持同时复制多个文件,当一次复制多个文件时,目标文 ...

  4. redis之 主从复制和哨兵

    一.Redis主从复制 主从复制:主节点负责写数据,从节点负责读数据,主节点定期把数据同步到从节点保证数据的一致性 1. 主从复制的相关操作 a,配置主从复制方式一.新增redis6380.conf, ...

  5. C# 获取文件扩展信息-应用名称/作者等

    方案一:使用微乳封装的Shell包 添加nuget包:Microsoft.WindowsAPICodePack.Shell using Microsoft.WindowsAPICodePack.She ...

  6. 如何在真实串口驱动还未加载的情况下调试uboot?

    1. 先找出真实串口是什么型号 1.1 怎么找?笔者提供两种方案: 方案一: 若当前的板子支持dm,从uboot的dts找串口节点对应的compatible属性 方案二: 从linux内核的dts找串 ...

  7. python笔记之按文件名搜索指定路径下的文件

    1.搜索文件名中以指定的字符串开头(如搜索dll,结果中含有dll a,dll abc等) 我的目录下有dll a.txt和dll.txt文件 其中a文件夹下还有这两个文件 我希望通过python选择 ...

  8. pytorch torch.backends.cudnn设置作用

    cuDNN使用非确定性算法,并且可以使用torch.backends.cudnn.enabled = False来进行禁用 如果设置为torch.backends.cudnn.enabled =Tru ...

  9. Python分词、情感分析工具——SnowNLP

    本文内容主要参考GitHub:https://github.com/isnowfy/snownlp what's the SnowNLP SnowNLP是一个python写的类库,可以方便的处理中文文 ...

  10. JavaXXX成长直通车_汇总

    学习开始于2019-12-08 阶段一 阶段一-01.万丈高楼,地基首要-第1章 学习指南-1-1 课程导学 1-2是图片 阶段一-01.万丈高楼,地基首要-第1章 学习指南-1-3 大型网站架构演变 ...