您的位置:首页 > 编程语言 > Java开发

java 多线程内存模型

2015-06-29 17:40 741 查看
首页

登录

面试题

JAVA

C++

Framework

其他译文

本站原创

并发书籍

加入我们

关于本站


并发编程网 - ifeve.com


让天下没有难学的技术

首页

JAVA

JAVA的内存模型及结构


JAVA的内存模型及结构

原文链接 译文链接 作者:Tai
Truong译者:Jaxon

所有的Java开发人员可能会遇到这样的困惑?我该为堆内存设置多大空间呢?OutOfMemoryError的异常到底涉及到运行时数据的哪块区域?该怎么解决呢?
Java内存模型

Java内存模型在JVM specification, Java SE 7 Edition, and mainly in the chapters “2.5 Runtime Data Areas” and “2.6 Frames”中有详细的说明。对象和类的数据存储在3个不同的内存区域:堆(heap
space)、方法区(method area)、本地区(native area)。

堆内存存放对象以及数组的数据,方法区存放类的信息(包括类名、方法、字段)、静态变量、编译器编译后的代码,本地区包含线程栈、本地方法栈等存放线程



方法区有时被称为持久代(PermGen)。



所有的对象在实例化后的整个运行周期内,都被存放在堆内存中。堆内存又被划分成不同的部分:伊甸区(Eden),幸存者区域(Survivor Sapce),老年代(Old Generation Space)。

方法的执行都是伴随着线程的。原始类型的本地变量以及引用都存放在线程栈中。而引用关联的对象比如String,都存在在堆中。为了更好的理解上面这段话,我们可以看一个例子:

01
import
java.text.SimpleDateFormat;
02
import
java.util.Date;
03
04
import
org.apache.log4j.Logger;
05
06
public
class
HelloWorld
{
07
private
static
Logger
LOGGER = Logger.getLogger(HelloWorld.
class
.getName());
08
09
public
void
sayHello(String
message) {
10
SimpleDateFormat
formatter =
new
SimpleDateFormat(
"dd.MM.YYYY"
);
11
String
today = formatter.format(
new
Date());
12
LOGGER.info(today
+
":
"
+
message);
13
}
14
}
这段程序的数据在内存中的存放如下:



通过JConsole工具可以查看运行中的Java程序(比如Eclipse)的一些信息:堆内存的分配,线程的数量以及加载的类的个数;



Java内存结构

这里有一份极好的白皮书:Memory Management in the Java HotSpot Virtual Machine。它描述了垃圾回收(GC)触发的内存自动管理。Java的内存结构包含如下部分:



堆内存

堆内存同样被划分成了多个区域:

包含伊甸(Eden)和幸存者区域(Survivor Sapce)的新生代(Young generation)
老年代(Old Generation)

不同区域的存放的对象拥有不同的生命周期:

新建(New)或者短期的对象存放在Eden区域;
幸存的或者中期的对象将会从Eden区域拷贝到Survivor区域;
始终存在或者长期的对象将会从Survivor拷贝到Old Generation;

生命周期来划分对象,可以消耗很短的时间和CPU做一次小的垃圾回收(GC)。原因是跟C一样,内存的释放(通过销毁对象)通过2种不同的GC实现:Young GC、Full GC。

为了检查所有的对象是否能够被销毁,Young GC会标记不能销毁的对象,经过多次标记后,对象将会被移动到老年代中。

哪儿的OutOfMemoryError

对内存结构清晰的认识同样可以帮助理解不同OutOfMemoryErrors:

Exception in thread “main”: java.lang.OutOfMemoryError: Java heap space
原因:对象不能被分配到堆内存中

Exception in thread “main”: java.lang.OutOfMemoryError: PermGen space

原因:类或者方法不能被加载到老年代。它可能出现在一个程序加载很多类的时候,比如引用了很多第三方的库;

Exception in thread “main”: java.lang.OutOfMemoryError: Requested array size exceeds VM limit

原因:创建的数组大于堆内存的空间

Exception in thread “main”: java.lang.OutOfMemoryError: request <size> bytes for <reason>. Out of swap space?

原因:分配本地分配失败。JNI、本地库或者Java虚拟机都会从本地堆中分配内存空间。

Exception in thread “main”: java.lang.OutOfMemoryError: <reason> <stack trace>(Native method)

原因:同样是本地方法内存分配失败,只不过是JNI或者本地方法或者Java虚拟机发现;

关于OutOfMemoryError的更多信息可以查看:“Troubleshooting Guide for HotSpot VM”, Chapter 3 on “Troubleshooting on memory leaks”

参考链接:

Provides Java HotSpot
information about VM Options and environment variables
Troubleshooting Guide for HotSpot VM

An exhaustive guide for memory leaks, system crashes, hangings, loops, signal and exception handling.
Java SE 6 HotSpot[tm] Virtual Machine Garbage
Collection Tuning

Ergonomics and tuning goals, generations sizing using VM arguments.
Thanks for the memory – Understanding how the
JVM uses native memory on Windows and Linux

Explains how the memory in the JVM like the heap is memory into the RAM on different operating systems and CPUs (32/64bit).
Java Micro Edition – Tuning

Describes runtime options to adjust performance in the Java ME edition. It also illustrates the compilation of bytecode into native code.
Summary of Sun’s document “Tuning Garbage collection with the 1.4.2
Hotspot JVM”.
Discussion about where references and objects are stored
in the JVM.

原创文章,转载请注明: 转载自并发编程网 – ifeve.com

本文链接地址: JAVA的内存模型及结构

4

About

Latest
Posts






Jaxon


Related Posts:

JVM实用参数(四)内存调优
最简单例子图解JVM内存分配和回收
JVM实用参数系列
在java
7中捕获多个异常
为什么我的JVM能实际使用的内存比-Xmx指定的少?
JVM的持久代——何去何从?
JVM实用参数(八)GC日志
面向GC的Java编程
并发工具类(二)同步屏障CyclicBarrier
并发工具类(一)等待多线程完成的CountDownLatch
测试并发应用(五)
编写有效的日志
Java
PermGen 去哪里了?
《JVM故障诊断指南》之1
—— JVM概览与介绍
JVM性能优化,
Part 5:Java的伸缩性
五个改善你服务器日志的技术

15MAY2015

2,613 人阅读

Jaxon

JAVA










(6 votes,
average: 4.83out of 5)

发表评论

发表评论

RSS订阅评论

Trackback 关闭

评论 (0)

暂无评论

您必须 登陆 后才能发表评论

Velocity官方指南-简介

无锁有序链表的实现

rss

本站服务器由UCloud云服务赞助


近期文章

Adopt Open JDK官方文档(四)基于虚拟机的编译环境

Adopt Open JDK官方文档(八)OpenJDK 项目介绍

阿里内贸团队敏捷实践-敏捷回顾

设计模式简单总结

JUC中Atomic class之lazySet的一点疑惑

Adopt OpenJDK 翻译计划

《JVM故障诊断指南》之4 —— Java 8:从持久代到metaspace

《JVM故障诊断指南》之3 —— Java 线程: JVM持有内存的分析

《JVM故障诊断指南》之2 —— 调整合适的Java堆大小的技巧

《JVM故障诊断指南》之1 —— JVM概览与介绍

JAVA面试题100问第一部分

Java I/O : Java中的进制详解

[译]深入 NGINX: 为性能和扩展所做之设计

戏(细)说Executor框架线程池任务执行全过程(下)

Java内存模型

JavaEE 要懂的小事:二、图解 Cookie(小甜饼)

JavaEE 要懂的小事:一、图解Http协议

戏(细)说Executor框架线程池任务执行全过程(上)

Java PermGen 去哪里了?

JDateTime

深入浅出ClassLoader

【Velocity官方指南】使用单例模式还是非单例模式

为何从10开始到99连续相乘会得到0?

通过JVM日志来进行安全点分析

Velocity官方指南-容器

并行编程中的内存回收Hazard Pointer

无锁有序链表的实现

JAVA的内存模型及结构

Velocity官方指南-简介

Velocity官方指南-Velocity是如何工作的


热门文章

Google Guava官方教程(中文版) 136,030 人阅读

Java NIO系列教程(一) Java NIO 概述 85,404 人阅读

Java并发性和多线程介绍目录 68,846 人阅读

Java NIO 系列教程 68,089 人阅读

Java NIO系列教程(十二) Java NIO与IO 62,196 人阅读

Java 7 并发编程指南中文版 52,896 人阅读

Java NIO系列教程(六) Selector 48,633 人阅读

Java NIO系列教程(二) Channel 44,910 人阅读

Java NIO系列教程(三) Buffer 44,844 人阅读

并发框架Disruptor译文 36,132 人阅读

剖析Disruptor:为什么会这么快?(一)锁的缺点 36,034 人阅读

《Storm入门》中文版 34,195 人阅读

《深入理解并行编程》中文版 32,587 人阅读

Netty 5用户指南 31,024 人阅读

Java NIO系列教程(八) SocketChannel 29,998 人阅读

Storm入门之第一章 27,811 人阅读

Java NIO系列教程(七) FileChannel 27,762 人阅读

Netty源码解读(一)概述 26,208 人阅读

Java并发结构 25,647 人阅读

Java并发性和多线程介绍 24,616 人阅读


近期评论

lecheng1986发表在《基本线程同步(五)使用Lock同步代码块

thinwind发表在《Adopt
OpenJDK 翻译计划》

petreltracy发表在《回答阿里面试题-HashMap是如何实现的?

郑玉婷发表在《Adopt
OpenJDK 翻译计划》

市长发表在《happens-before俗解

bobwenx发表在《Adopt
OpenJDK 翻译计划》

骨汤鸡蛋面发表在《并发编程模型

李 璟发表在《为何从10开始到99连续相乘会得到0?

fleese发表在《京东面试题-1亿条数据如何保存

star123045发表在《京东面试题-1亿条数据如何保存

jadic发表在《最简单例子图解JVM内存分配和回收

liuxinglanyue发表在《Java内存模型

乖,摸摸头发表在《为何从10开始到99连续相乘会得到0?

fleese发表在《回答高并发,执行耗时短的任务,还有低并发,执行耗时长的任务,各自选取什么样的线程池会比较合理?为什么?如果业务场景是高并发,且任务耗时长时,有什么解决思路?

fleese发表在《京东面试题-1亿条数据如何保存

fleese发表在《京东面试题-1000万条数据如何取出来

fleese发表在《京东面试题-1000万条数据如何取出来

木秀林发表在《Java内存模型

方 腾飞发表在《Java内存模型

方 腾飞发表在《Java内存模型


标签

actor Basic cacheline classes collectionsconcurrency Concurrentconcurrent
data structure ConcurrentHashMapCustomizing design Executor Executor
framework False Sharing faq fork Fork/Join fork
join Framework Functional
ProgrammingGuava IO JAVA java8 jmm join JVMlock Memory
Barriers Netty NIO OAuth
2.0pattern-matching quartz RingBuffer ScalaSemaphore stm Storm synchronizationSynchronized thread tomcat volatile 多线程


文章归档

2015年六月 (21)

2015年五月 (15)

2015年四月 (27)

2015年三月 (13)

2015年二月 (11)

2015年一月 (13)

2014年十二月 (26)

2014年十一月 (61)

2014年十月 (33)

2014年九月 (47)

2014年八月 (27)

2014年七月 (13)

2014年六月 (32)

2014年五月 (45)

2014年四月 (41)

2014年三月 (34)

2014年二月 (38)

2014年一月 (19)

2013年十二月 (10)

2013年十一月 (5)

2013年十月 (20)

2013年九月 (38)

2013年八月 (48)

2013年七月 (26)

2013年六月 (16)

2013年五月 (9)

2013年四月 (17)

2013年三月 (41)

2013年二月 (25)

2013年一月 (57)

2012年十二月 (9)

2012年十月 (1)

2012年八月 (1)


友情链接

coolshell

Programer. 大猫

一粟的博客

北京猎聘网

志俊的博客

最代码

点点折

码梦为生

纳秒


分类目录

akka (18)

Android (3)

C++ (11)

CPU (2)

Framework (44)

GO (6)

guava (22)

JAVA (317)

JVM (32)

linux (7)

Netty (22)

Scala (9)

storm (12)

Velocity (3)

Web (11)

公告 (5)

大数据 (20)

好文推荐 (26)

并发书籍 (89)

并发译文 (357)

技术问答 (11)

敏捷管理 (5)

本站原创 (69)

架构 (16)

活动 (6)

网络 (3)



感谢又拍云为本站提供服务器和图片服务。

版权所有 © 并发编程网 – ifeve.com

ICP号: 浙ICP备12046809号


量子统计

return top
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: