「每日五分钟,玩转JVM」:线程共享区
前言
上一篇中,我们了解了JVM中的线程独占区,这节课我们就来了解一下JVM中的线程共享区,JVM中的线程共享区是跟随JVM启动时一起创建的,包括堆(Heap)和方法区()两部分,而线程独占区的程序计数器,虚拟机栈,本地方法栈的生命周期都是跟随线程的,随线程的创建而诞生,随线程的销毁而销毁。
堆(Heap)
堆内存作为JVM管理的内存中最大的一块,用于存放我们的对象实例,我们经常会把JVM的内存简单的分为堆内存和栈内存,这样说虽然有些片面,但是也有这么说的道理,这两块儿一个作为执行程序的,一个作为存放对象的,是JVM中最为重要的两块儿内存。所以,我们的垃圾收集一般是针对的用于存放对象的堆内存,所以堆内存有时候也会被称为GC堆。
从内存分配的角度上来说,堆内存中包含了新生代内存和老年代内存,而年轻代又分为Eden和Survivor区。Survivor区由From Survivor和To Survivor组成。Eden区占大容量,Survivor两个区占小容量,默认比例是8:1:1,而且JVM 每次只会使用 Eden 和其中的一块 Survivor 区域来为对象服务,所以无论什么时候,总是有一块 Survivor 区域是空闲着的。

这样设计的原因是为了更方便的进行垃圾收集,我们会在后面垃圾收集的章节中去详细的讲解。
TLAB
TLAB的全称是Thread Local Allocation Buffer,即线程本地分配缓存区,这是一个处于堆内存中线程私有的内存分配区域,默认情况下这个区域就是开启的,当然我们也可以在启动时配置XX:+UseTLAB去开启该区域,这个区域所占空间非常的小,默认情况下只占Eden区域的1%,我们也可以通过也XX:TLABWasteTargetPercent设置TLAB空间所占用Eden空间的百分比大小。
方法区
方法区存储虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据,在Java虚拟机的规范中,把方法区认为是堆内存的逻辑部分,但是实际上他们是完全隔离的。
在JDK 8 之前,方法区被称为(或者可以说是被实现为)持久代,永久代(Perman Gen),而在 JDK 8 之后,取消了永久代的概念,取而代之的实现是元空间(MetaSpace),原本位于永久代中的运行时常量池和静态变量都存储到了堆中,而其余的内容则是移到了元空间。
元空间的本质和永久代类似,都是对JVM规范中方法区的实现,它们之间最大的区别在于:元空间并不在虚拟机中,而是使用本地内存。因此,默认情况下,元空间的大小仅受本地内存限制,但可以通过以下参数来指定元空间的大小:-XX:MetaspaceSize-XX:MaxMetaspaceSize。
所以我们前几年JDK7盛行的时候OOM错误消息是这样的:
java.lang.OutOfMemoryError:PermGen space
而在近几年JDK8的使用中遇到的OOM是这样的:
java.lang.OutOfMemoryError:Metaspace
运行时常量池
运行时常量池位于元空间中,用于存储编译期生成的各种字面量和符号引用,而这里需要注意一点:字符串常量池从JDK 7 之后就移到了堆内存中去管理,但是运行时常量是仍然位于方法区基于JDK 8 的新实现——元空间中。
网上有部分声音说运行时常量池在JDK8移到了堆内存中,其实这种说法是错误的,真正移到堆内存的是字符串常量池,并且是在JDK7的更新中就已经移到了堆中。
更详细的关于常量池的信息我们会在类结构中去学习。
后话
每天五分钟,跟Vi玩转JVM!
下篇解密一个对象的诞生!
公众号
本文首发于公众号,扫码关注即可获取最新文章

「每日五分钟,玩转JVM」:线程共享区的更多相关文章
- 「每日五分钟,玩转 JVM」:GC 概览
前言 GC(Garbage Collection)是我们在学习 JVM 的过程中不可避免的一道坎,接下来,我们就来系统的学习一下 GC. 做一件事情之前,我们一定要去知道我们为什么要去做,这里不仅仅指 ...
- 「每日五分钟,玩转JVM」:线程独占区
前言 如果我们对计算机组成有所了解,那么我们一定会知道在计算机中有一块儿特殊的区域,称之为寄存器,寄存器包括了指令寄存器和程序计数器,这两样位于CPU中,作为程序运行的大脑来控制程序的运行和流转. 而 ...
- 「每日五分钟,玩转JVM」:对象从哪来
面向对象 众所周知,Java是一门面向对象的高级编程语言,那么现在问题来了,对象从哪来呢?有些人会说通过new关键字来创建一个对象,说的很好,本篇我们就来解密在new一个对象的过程中,JVM都给我们做 ...
- 「每日五分钟,玩转JVM」:对象内存布局
概览 一个对象根据不同情况可以被划分成两种情况,当对象是一个非数组对象的时候,对象头,实例数据,对齐填充在内存中三分天下,而数组对象中在对象头中多了一个用于描述数组对象长度的部分 对象头 对象头分为两 ...
- 「每日五分钟,玩转JVM」:指针压缩
64位JVM和32位JVM 最初的时候,JVM是32位的,但是随着64位系统的兴起,JVM也迎来了从32位到64位的转换,32位的JVM对比64位的内存容量比较有限,但是我们使用64位虚拟机的同时,也 ...
- 「每日五分钟,玩转JVM」:两种算法
前言 上篇文章,我们了解了GC 的相关概念,这篇文章我们通过两个算法来了解如何去确定堆中的对象实例哪些是我们需要去回收的垃圾对象. 引用计数算法 引用计数法的原理很简单,就是在对象中维护一个计数器,当 ...
- zookeeper-架构设计与角色分工-《每日五分钟搞定大数据》
本篇文章阅读时间5分钟左右 点击看<每日五分钟搞定大数据>完整思维导图 zookeeper作为一个分布式协调系统,很多组件都会依赖它,那么此时它的可用性就非常重要了,那么保证可用性的同 ...
- zookeeper核心-zab协议-《每日五分钟搞定大数据》
上篇文章<paxos与一致性>说到zab是在paxos的基础上做了重要的改造,解决了一系列的问题,这一篇我们就来说下这个zab. zab协议的全称是ZooKeeper Atomic Bro ...
- HDFS-异常大全-《每日五分钟搞定大数据》
点击看<每日五分钟搞定大数据>完整思维导图以及所有文章目录 问题1:Decomminssioning退役datanode(即删除节点) 1.配置exclude: <name>d ...
随机推荐
- [PTA] 数据结构与算法题目集 6-12 二叉搜索树的操作集
唯一比较需要思考的删除操作: 被删除节点有三种情况: 1.叶节点,直接删除 2.只有一个子节点,将子节点替换为该节点,删除该节点. 3.有两个子节点,从右分支中找到最小节点,将其值赋给被删除节点的位置 ...
- IOCP Input/Output Completion Port IO完成端口
I/O completion ports provide an efficient threading model for processing multiple asynchronous I/O r ...
- centOS7 安装mysql-5.7.20-1.el7.x86_64.rpm-bundle.tar
在虚拟机上安装mysql走了不少弯路,在此备份... 首先感谢下这几篇博客提供的帮助: https://www.cnblogs.com/pythonal/p/6141516.html http://b ...
- SQL SERVER中生僻字问题存储与查询问题
以下仅记录碰到的几个问题 1.首先字段设置为varchar的时候存储后无法进行正常的显示 显示为? 此状态下匹配查询或者Like模糊查询都没问题 2.将字段设置为nvarchar,在进行插入或者跟新时 ...
- java练习---5
//程序员:罗元昊 2017.9.17 package demo;import java.util.Scanner;public class Ly { public static void main ...
- PHP与ECMAScript_6_常用运算符
优先级从上到下 PHP ECMAScript 特殊运算符 [ ] ,( ) [ ] ,( ) 自增减/类型 ++ -- ! int float string array object @ (错误抑 ...
- .net RabbitMQ 介绍、安装、运行
RabbitMQ介绍 什么是MQ Message Queue(简称:MQ),消息队列 顾名思义将内容存入到队列中,存入取出的原则是先进先出.后进后出. 其主要用途:不同进程Process/线程Thre ...
- ASP.NET Core - 实现自定义WebApi模型验证
Framework时代 在Framework时代,我们一般进行参数验证的时候,以下代码是非常常见的 [HttpPost] public async Task<JsonResult> Sav ...
- jdk1.8源码解析:HashMap底层数据结构之链表转红黑树的具体时机
本文从三个部分去探究HashMap的链表转红黑树的具体时机: 一.从HashMap中有关“链表转红黑树”阈值的声明: 二.[重点]解析HashMap.put(K key, V value)的源码: 三 ...
- [ PyQt入门教程 ] PyQt5基本控件使用:单选按钮、复选框、下拉框
本文主要介绍PyQt5界面最基本使用的单选按钮.复选框.下拉框三种控件的使用方法进行介绍. 1.RadioButton单选按钮/CheckBox复选框.需要知道如何判断单选按钮是否被选中. 2.Com ...