深入理解java虚拟机(1)走进jvm
1.JDK:java程序设计语言、java虚拟机、javaAPI
二、自动内存管理机制
-----------------------------------------------------
1.运行时数据区域:
(1)java虚拟机在执行java程序的过程中会把所管理的内存划分为若干个不同的数据区域。这些区域有着各自的用途,以及创建和销毁的时间,有些区域随着虚拟机的启动而存在,有些区域则是依赖用户线程的启动和结束而创建和销毁。
(2)java虚拟机所管理的内存会包括以下几个运行时数据区域
(3)从上图可以看出堆区和方法区是被所有线程共享的。java虚拟机栈、本地方法区以及程序计数器这几个之间是线程隔离的数据区
2.程序计数器:当前线程所执行的字节码的行号指示器。字节码解释器的工作就是通过改变计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程回复等基础功能都需要依赖这个计数器来完成。为了线程切换之后能够恢复到正确的位置,每个线程需要一个独立的程序计数器
3.java虚拟机栈。也是线程私有的,生命周期与线程相同。
(1)虚拟机栈描述的是java方法执行的内存模型:每个方法执行的时候都会创建一个栈帧,用于存储局部变量表、操作栈、动态链接、方法出口等信息。每个方法被调用直至完成的过程,就对应着一个栈帧在虚拟机栈中从入栈到出站的过程。
(2)虚拟机栈一般用来存放局部变量。局部变量表所需的内存空间在编译器间完成分配,当进入一个方法的时候,这个方法需要在帧中分配多大的局部变量空间是完全确定的,在方法执行期间,不会改变局部变量表的大小
(3)在java虚拟机中,对于区域规定了两种异常情况:如果请求栈深度大于虚拟机所允许的深度,就会抛出StackOverflowError异常;如果虚拟机可以动态扩展,当扩展时无法申请到足够的内存的时候会抛出OutOfMemoryError异常
4.本地方法栈(Native Method Stacks)与虚拟机栈所发挥的作用是非常相似的,只不过虚拟机栈是为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则为虚拟机使用到的Ntive方法服务
5.java堆。存放数组和对象的地方。
(1)java堆是java虚拟机所管理的内存中最大的一块。java堆是 被所有线程共享的一块区域,在虚拟机启动的时候进行创建。堆内存唯一存储的是实例对象,几乎所有对象实例都在这里进行内存的分配。几乎所有对象实例都要在这里分配内存。
(2)java堆是垃圾收集器管理的主要区域,因此很多时候也称为GC堆(Garbage Collected Heap)。java堆可以细分为:新生代和老年代;如果再细致一点有Eden空间、From Survivor空间、To Survivor空间等。
(3)java虚拟机规定,java堆可以处于物理上不连续的内存空间中,只要逻辑上连续即可,就像磁盘空间一样。如果堆中没有完成内存的分配并且无法扩展的时候,就会抛出OutOfMemoryError异常
(4)java堆。heap:存放对象和数组的地方,堆分为两个区域:young generation(年轻代)+old genneration(年老代)
young generation(年轻代)又可以分为eden(伊甸区)、survivor1(幸存一区)和survivor2(幸存二区)
(5)permanent区(永久区)。相当于方法区(存放类和方法的地方)。
6.方法区(Method Area)。和堆区一样,是各个线程共享的内存区,用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等。还有一个别名非堆。这个区域回收的目标主要是主要是常量池的回收和类型的卸载。方法区溢出是因为类太多导致的。静态码块在类加载的时候运行,类加载的时候加载一次,后面就不再进行加载了。
7.运行时常量池。是方法区的一部分,用于存放编译期生成的各种字面量和符号引用。
8.直接内存。不是虚拟机运行时数据区的一部分,也不是虚拟机规范中定义的内存区域,但是这部分内存因为被频繁使用,可能会导致OutOfMemoryError异常出现。
9.编写java源码 *.java ------(编译)----->*.class-----ClassLoader(类加载器,加载*.class文件到JVM中)
10.
深入理解java虚拟机(1)走进jvm的更多相关文章
- 深入理解java虚拟机-01 走进java
第一章是对java的产生,历史的整体介绍 java的使用很广泛,安装jdk的时候会看到一句广告语runs in 10 billions machines.使用java的设备多达几十亿台 1.概述 优点 ...
- 深入理解java虚拟机(linux与jvm内存关系)
本文转载自美团技术团队发表的同名文章 https://tech.meituan.com/linux-jvm-memory.html 一, linux与进程内存模型 要理解jvm最重要的一点是要知道jv ...
- 深入理解java虚拟机笔记补充-JVM常见参数设置
JVM 常见参数设置 内存设置 参数 -Xms:初始堆大小,JVM 启动的时候,给定堆空间大小. -Xmx:最大堆大小,如果初始堆空间不足的时候,最大可以扩展到多少. -Xmn:设置年轻代大小.整个堆 ...
- 读书笔记-《深入理解Java虚拟机:JVM高级特性与最佳实践》
目录 概述 第一章: 走进Java 第二章: Java内存区域与内存溢出异常 第三章: 垃圾收集器与内存分配策略 第四章: 虚拟机性能监控与故障处理 第五章: 调优案例分析与实战 第六章: 类文件结构 ...
- 《深入理解Java虚拟机:JVM高级特性与最佳实践》【PDF】下载
<深入理解Java虚拟机:JVM高级特性与最佳实践>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230062566 内容简介 作为一位 ...
- 深入理解JAVA虚拟机JVM
深入理解JAVA虚拟机JVM Java 虚拟机(Java virtual machine,JVM)是运行 Java 程序必不可少的机制.java之所以能实现一次编写到处执行,也就是因为jVM.原理:编 ...
- 深入理解Java虚拟机 -- 读书笔记(1):JVM运行时数据区域
深入理解Java虚拟机 -- 读书笔记:JVM运行时数据区域 本文转载:http://blog.csdn.net/jubincn/article/details/8607790 本系列为<深入理 ...
- 深入理解java虚拟机学习笔记(一)JVM内存模型
上周末搬家后,家里的宽带一直没弄好,跟电信客服反映了N遍了终于约了个师傅明天早上来迁移宽带,可以结束一个多星期没网的痛苦日子了.这段时间也是各种忙,都一个星期没更新博客了,再不写之前那种状态和激情都要 ...
- 什么是HotSpot VM & 深入理解Java虚拟机 JVM
参考 http://book.2cto.com/201306/25434.html 另外,这篇文章也是从一个系列中得出的: <深入理解Java虚拟机:JVM高级特性与最佳实践(第2版)> ...
随机推荐
- sqlmap自动注入 --DETECTION
--level /usr/shar/sqlmap/xml/payloads 多个脚本 sqlmap里面的payload都在这里面 --risk 1-4(默认 1/ 无害) Risk升高可造成数据被串改 ...
- [CSP-S模拟测试]:小Y的图(最小生成树+LCA)
题目传送门(内部题131) 输入格式 第一行三个整数$n$.$m$和$Q$. 接下来$m$行每行三个整数$x$.$y$.$z$($1\leqslant x,y\leqslant n,1\leqslan ...
- SpringMVC配置多个自定义拦截器
特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过.如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/ ...
- 【JVM】jstack和dump线程分析(2)
一:jstack jstack命令的语法格式: jstack <pid>.可以用jps查看java进程id.这里要注意的是:1. 不同的 JAVA虚机的线程 DUMP的创建方法和文件格式 ...
- linux新建用户tab无法补全命令
查看passwd cat /ect/passwd 发现root用户的shell是/bin/bash 普通用户的shell是/bin/sh 修改普通用户的为/bin/bash即可
- 三步解决IDEA系列开发工具 RubyMine、IntelliJ IDEA 卡顿问题
近日有小伙伴跟我反映说自己的开发工具很卡,有没有什么解决方案?答案是当然有啦!接下来看看怎么设置! 1.打开RubyMine,或IDEA,上边工具栏选择Help,下拉选择Edit Custom VM ...
- Python_序列对象内置方法详解_String
目录 目录 前言 软件环境 序列类型 序列的操作方法 索引调用 切片运算符 扩展切片运算符 序列元素的反转 连接操作符 重复运算符 成员关系符 序列内置方法 len 获取序列对象的长度 zip 混合两 ...
- Swift 发送邮件和附件
public function send($filename, array $render = [],$subject = '审核通知') { // Create the Transport $tra ...
- LeetCode.925-长按的名字(Long Pressed Name)
这是悦乐书的第355次更新,第380篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第217题(顺位题号是925).你的朋友正在键盘上输入他的名字. 有时,在键入字符c时, ...
- spring5的基本组成(6个模块)
1:数据访问及集成(Data Access/Integeration):jdbc,orm,oxm,jms,transactions ——由 spring-jdbc.spring-tx.spring-o ...