Java Web 深入分析(11) JVM(1)
前言
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)的更多相关文章
- Java Web 深入分析(6) Tomcat
tomcat是什么:汤姆猫?Javaweb服务器? Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache ...
- Java Web 深入分析(11) JVM 体系结构与工作方式
jvm体系 jvm简介 java virtual machine jvm体系详解 jvm工作机制 虚拟机怎么执行代码 jvm为何基于栈 执行引擎 执行引擎过程 java调用栈 总结
- Java Web 深入分析(12) JVM(2) 垃圾收集与内存分配
前言 java的内存分配和垃圾回收往往是影响系统性能和并发能力的主要因素,虚拟机提供许多的参数就是为了根据不同环境和请教下进行调优,没有最好的调优也没有固定的调优.需要我们深入的去了解jvm的各个垃圾 ...
- Java Web 深入分析(8) Servlet工作原理解析
Servlet Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,主要功能在于交互式地浏览和修改数据,生成动态We ...
- Java Web 深入分析(7) Jetty原理解析
1Jetty的基本架构 Jetty有一个基本的数据模型,这个模式就是handle,所有拷贝拓展的组件都被当做一个handler被添加到server中,然后由jetty统一管理. 1.1Jetty基本架 ...
- Java Web 深入分析(5) Java ClassLoader 工作机制
Classloader 有3个作用 将class加载到JVM中去 审查每个类由谁去加载,是一种父优先的等级加载 把Class字节码统一编译成JVM统一要求的对象格式 ClassLoader的等级加载机 ...
- Java Web 深入分析(4) Java IO 深入分析
I/O问题可以说是现在海量数据时代下 ,I/O大部分web系统的瓶颈.我们要了解的java I/O(后面简称为(IO)) IO类库的基本结构 磁盘IO的工作机制 网络IO的工作机制 NIO的工作方式 ...
- Java Web 深入分析(10) Spring 实践
Spring helloworld [http://wiki.jikexueyuan.com/project/spring/hello-world-example.html] HelloWorld.j ...
- Java Web 深入分析(9) Session 和 Cookie
前言: session 和cookie都是为了保持服务器和客户端之间交互状态.如果一天的PV有几亿,而一个cookie占200个字节但是也会占用很多带宽?所以大访问量就引用session,但是几百台服 ...
随机推荐
- 【洛谷】P1449 后缀表达式
P1449 后缀表达式 分析: 简单的模拟题. 熟练容器stack的话很容易解决. stack,栈,有先进后出的特性. 比如你有一个箱子,你每放进第一个数时,就往箱底放,放第二个数时就在第一个数的上面 ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统-代码生成器用法
新的代码生成器比老的更加容易使用,要生成什么形式就选择什么形式,新的代码生成器采用的是WCF界面开发,同样采用开源的模式,根据自己使用习惯容易扩展 1.单列表模式 2.树形列表模式 3.左右列表模式 ...
- 数据仓库DW、ODS、DM概念及其区别
整体结构 在具体分析数据仓库之前先看下一下数据中心的整体架构以及数据流向 数据中心整体架构.png DB 是现有的数据来源,可以为mysql.SQLserver.文件日志等,为数据仓库提供数据来源 ...
- 在python中使用elasticsearch 需要注意的一些问题
1, py es client 使用是 http ,java api 使用是 tcp 2, es.scroll() 方法 在查询多个索引的时候会报 : elasticsearch.exception ...
- InvalidSelectorError: Compound class names not permitted报错处理
InvalidSelectorError: Compound class names not permitted报错处理 环境:python3.6 + selenium 3.11 + chromed ...
- PHP系列 | PHP5.6 安装 endroid/qr-code 遇到的问题
官方库地址:https://packagist.org/packages/endroid/qr-code PHP5.6 的最高版本为:2.5.1 通过composer安装 composer requi ...
- arcgis python脚本工具实例教程—栅格范围提取至多边形要素类
arcgis python脚本工具实例教程-栅格范围提取至多边形要素类 商务合作,科技咨询,版权转让:向日葵,135-4855_4328,xiexiaokui#qq.com 功能:提取栅格数据的范围, ...
- 源码包的三个参数make-configure-make install解释
1.configure 这一步一般用来生成 Makefile,为下一步的编译做准备,你可以通过在 configure 后加上参数来对安装进行控制,比如代码: ./configure --prefix= ...
- Python3基础 yield 在无返回值的函数中的简单示例
Python : 3.7.3 OS : Ubuntu 18.04.2 LTS IDE : pycharm-community-2019.1.3 ...
- Learning Face Age Progression: A Pyramid Architecture of GANs-1-实现人脸老化
Learning Face Age Progression: A Pyramid Architecture of GANs Abstract 人脸年龄发展有着两个重要的需求,即老化准确性和身份持久性, ...