- 浏览: 1112587 次
文章分类
- 全部博客 (379)
- S2SH (16)
- stuts2 (0)
- java语言 (81)
- JSP (17)
- <html>元素 (11)
- javaweb (4)
- web容器 (3)
- ext (23)
- javaScript (48)
- ant (1)
- liferay (1)
- sql (9)
- css (42)
- 浏览器设置 (3)
- office_world (1)
- eclipse (4)
- 其它 (28)
- 操作系统 (5)
- android (6)
- Struts2 (11)
- RegEx (3)
- mysql (5)
- BigDATA (1)
- Node.js (1)
- Algorithm (10)
- Apache Spark (1)
- 数据库 (5)
- linux (2)
- git (1)
- Adobe (3)
- java语言,WebSocket (1)
- Maven (3)
- SHELL (1)
- XML (2)
- 数学 (2)
- Python (2)
- Java_mysql (1)
- ReactJS (6)
- 养生 (4)
- Docker (1)
- Protocols (3)
- java8 (2)
- 书籍 (1)
- Gradle (2)
- AngularJS (5)
- SpringMVC (2)
- SOAP (1)
- BootstrapCSS (1)
- HTTP协议 (1)
- OAuth2 (1)
最新评论
-
Lixh1986:
Java并发编程:自己动手写一把可重入锁https://blo ...
Java之多线程之Lock与Condition -
Lixh1986:
http://win.51apps.com.cn/https: ...
temp -
ztwsl:
不错,支持很好
HttpServletRequest和ServletRequest的区别 -
guodongkai:
谢谢您能将知识精华汇编总结,让初学者们从原理中学会和提高。
javaScript之function定义 -
kangwen23:
谢谢了,顶顶
struts2中的ValueStack学习
Java 内存模型之堆内存(Heap)
一、背景知识:内存类型介绍
1、什么是 Perm Gen?
Perm Gen : Permanent Generation
Perm Gen 区是一个特殊的JVM内存区,因为它用来存储用来描述 Class 的
元数据(Class 可以不属于Java语言的一部分,也可以属于),诸如:描述类及其方法。
在大的应用中该区一会儿就满了,并抛出错误:java.lang.OutOfMemoryError: PermGen
然而无论你怎么设置 -Xmx 也不管用。
因为设置其大小的参数不是 -Xmx,而是 -XX:PermGen, -XX:MaxPermGen (不同Java版本略有变化)
2、Heap VS. Stack VS. Perm
Heap(堆内存):
使用Java语言创建的所有的引用对象类型,都在此存储。并由 GC (Garbage Collection)对其进行管理,
诸如:释放不再被程序引用的对象所占据的内存。
Stack(栈内存):
与 Heap 相对的是,Stack 存放基础数据类型。诸如:int, char 等。
由程序的执行顺序控制变量的进出栈顺序,而不是由 GC 控制栈内存的管理。
Perm(持久内存):
用于存储类的元数据。诸如:类的定义,方法的定义等。
Perm 的生命周期与 JVM 绑定,而 Heap 的生命周期与程序绑定。
二、堆内存(Heap) 与 Garbage Collection
理解 GC (Garbage Collection),需要理解 Heap 。
JVM 的 Heap 堆内存在物理上被划分为两部分:Young Gen, Old Gen
1、 JVM 内存管理之:Young Gen
所有新创建的 Object 首先被放在 Young Generation 内存区。
如果 Young Generation 内存区满了,则执行 Garbage Collection 。这种 GC 称为 Minor GC。
Young Generation 区又分为三部分: Eden Memory,Survivor0 Memory (S0),Survivor1 Memory(S1).
Young Generation 内存区要点:
1、绝大多数新建的 Object 被放在 Eden Memory
2、如果 Eden Memory 内存满了,则进行 GC 操作。
同时把未被 GC 的 Object 移动到 S0 或 S1 中。
此时 Minor GC 也会检查和移动 S0 和 S1 中的对象。
最后使 S0,S1 其中一个置为空。
3、多次 GC 后仍然未被 GC 的 Object 将被移动到 Old Gen 内存区中。
通常 Object 会被 GC 设定一个轮询的阀值。
2、 JVM 内存管理之:Old Gen
Old Gen 内存区存放了经过多次 Minor GC 后仍然不能被 GC 的 Object。
与 Young Gen 相同,当 Old Gen 区满了之后将执行 GC 操作,该操作称为:Major GC。
耗用的时间也相对较长。
stop-the-world 事件
Young Gen 和 Old Gen 都可以主动触发 stop-the-world 事件,挂起所有任务,执行 GC 操作。
被挂起的任务只有在 GC 执行完毕后,才会恢复执行。
多数情况下, GC 性能调优(GC tuning)就是指降低 stop-the-world 时 GC 执行的时间。
三、Perm Gen
JVM 在 Permanent Generation 或 Perm Gen 内存区中存放应用程序的元数据
(application metadata),用来描述类及其方法的原始信息。
注意:Perm Gen 不是 Heap 的一部分。
Perm Gen 被 JVM 使用于应用程序运行期间(runtime),基于应用所使用到的类。
Perm Gen 中同时包括 Java SE 包中的类。
Perm Gen 只有在执行 Full GC 时才会被 GC。
四、内存管理调优参数
-Xms
设置JVM启动时的堆内存(Heap)的大小
-Xmx For setting the maximum heap size.
设置堆内存(Heap)的最大值
-Xmn
设置 Young Gen 内存区的大小
-XX:PermGen
设置 Perm Gen 内存的初始大小
-XX:MaxPermGen
设置 Perm Gen 内存的最大值
-XX:SurvivorRatio
设置 Eden Gen 与 S0 Gen,S1 Gen 内存的大小比。默认值:8
例如:
Young Gen 大小为 10M,
-XX:SurvivorRatio=2
则:
Eden Gen 的大小为 5,
S0 和 S1 的大小分别为 2.5
-XX:NewRatio
设置 Old Gen / Young Gen 的值。默认:2
大部分情况下,默认值不用调。详细请参考官方文档。
五、Java内存管理之 Garbage Collection
垃圾回收 GC (Garbage Collection) 是 Java 鉴别、移出内存中不再使用的对象,
并释放其所占内存的过程。
Java 语言的一项非常好的特点就是:自动垃圾回收(Automatic GC)。
不像其它语言(例如 C 语言),需要手动释放内存。
Java 的垃圾收集器是一个在后台运行的程序,它检查所有在内存中运行的对象,
并找出那些不再在程序中的任何地方引用到的对象。
这些对象将被声明为程序运行垃圾,以释放其所占的内存,为其它对象继续使用。
GC 的运行步骤:
1、Marking(标记):
这是GC工作的第一步。鉴定出不再使用的对象,并对其进行标记。
2、Normal Deletion(一般化删除):
移除不使用的对象,并释放其所占空间。
3、Deletion with Compacting(压缩删除):
在删除所有不再使用的对象后,所有未被删除的对象将被移动到一起。
这样可以提高对 new Objects 分配内存时的性能。
这种简单的 Mark 然后 delete 的方式有两点不足:
1、不高效。新对象刚创建完,还没有被引用时就被删除了。
2、重复。那些即使一直被程序引用的对象,也要在每次的GC轮询中被检查。
-
转载请注明,
原文出处:http://lixh1986.iteye.com/blog/2351465
-
引用:
http://www.journaldev.com/2856/java-jvm-memory-model-memory-management-in-java
http://stackoverflow.com/a/4848711/2893073
http://www.cubrid.org/blog/dev-platform/understanding-java-garbage-collection
一、背景知识:内存类型介绍
1、什么是 Perm Gen?
Perm Gen : Permanent Generation
Perm Gen 区是一个特殊的JVM内存区,因为它用来存储用来描述 Class 的
元数据(Class 可以不属于Java语言的一部分,也可以属于),诸如:描述类及其方法。
在大的应用中该区一会儿就满了,并抛出错误:java.lang.OutOfMemoryError: PermGen
然而无论你怎么设置 -Xmx 也不管用。
因为设置其大小的参数不是 -Xmx,而是 -XX:PermGen, -XX:MaxPermGen (不同Java版本略有变化)
2、Heap VS. Stack VS. Perm
Heap(堆内存):
使用Java语言创建的所有的引用对象类型,都在此存储。并由 GC (Garbage Collection)对其进行管理,
诸如:释放不再被程序引用的对象所占据的内存。
Stack(栈内存):
与 Heap 相对的是,Stack 存放基础数据类型。诸如:int, char 等。
由程序的执行顺序控制变量的进出栈顺序,而不是由 GC 控制栈内存的管理。
Perm(持久内存):
用于存储类的元数据。诸如:类的定义,方法的定义等。
Perm 的生命周期与 JVM 绑定,而 Heap 的生命周期与程序绑定。
二、堆内存(Heap) 与 Garbage Collection
理解 GC (Garbage Collection),需要理解 Heap 。
JVM 的 Heap 堆内存在物理上被划分为两部分:Young Gen, Old Gen
1、 JVM 内存管理之:Young Gen
所有新创建的 Object 首先被放在 Young Generation 内存区。
如果 Young Generation 内存区满了,则执行 Garbage Collection 。这种 GC 称为 Minor GC。
Young Generation 区又分为三部分: Eden Memory,Survivor0 Memory (S0),Survivor1 Memory(S1).
Young Generation 内存区要点:
1、绝大多数新建的 Object 被放在 Eden Memory
2、如果 Eden Memory 内存满了,则进行 GC 操作。
同时把未被 GC 的 Object 移动到 S0 或 S1 中。
此时 Minor GC 也会检查和移动 S0 和 S1 中的对象。
最后使 S0,S1 其中一个置为空。
3、多次 GC 后仍然未被 GC 的 Object 将被移动到 Old Gen 内存区中。
通常 Object 会被 GC 设定一个轮询的阀值。
2、 JVM 内存管理之:Old Gen
Old Gen 内存区存放了经过多次 Minor GC 后仍然不能被 GC 的 Object。
与 Young Gen 相同,当 Old Gen 区满了之后将执行 GC 操作,该操作称为:Major GC。
耗用的时间也相对较长。
stop-the-world 事件
Young Gen 和 Old Gen 都可以主动触发 stop-the-world 事件,挂起所有任务,执行 GC 操作。
被挂起的任务只有在 GC 执行完毕后,才会恢复执行。
多数情况下, GC 性能调优(GC tuning)就是指降低 stop-the-world 时 GC 执行的时间。
三、Perm Gen
JVM 在 Permanent Generation 或 Perm Gen 内存区中存放应用程序的元数据
(application metadata),用来描述类及其方法的原始信息。
注意:Perm Gen 不是 Heap 的一部分。
Perm Gen 被 JVM 使用于应用程序运行期间(runtime),基于应用所使用到的类。
Perm Gen 中同时包括 Java SE 包中的类。
Perm Gen 只有在执行 Full GC 时才会被 GC。
四、内存管理调优参数
-Xms
设置JVM启动时的堆内存(Heap)的大小
-Xmx For setting the maximum heap size.
设置堆内存(Heap)的最大值
-Xmn
设置 Young Gen 内存区的大小
-XX:PermGen
设置 Perm Gen 内存的初始大小
-XX:MaxPermGen
设置 Perm Gen 内存的最大值
-XX:SurvivorRatio
设置 Eden Gen 与 S0 Gen,S1 Gen 内存的大小比。默认值:8
例如:
Young Gen 大小为 10M,
-XX:SurvivorRatio=2
则:
Eden Gen 的大小为 5,
S0 和 S1 的大小分别为 2.5
-XX:NewRatio
设置 Old Gen / Young Gen 的值。默认:2
大部分情况下,默认值不用调。详细请参考官方文档。
五、Java内存管理之 Garbage Collection
垃圾回收 GC (Garbage Collection) 是 Java 鉴别、移出内存中不再使用的对象,
并释放其所占内存的过程。
Java 语言的一项非常好的特点就是:自动垃圾回收(Automatic GC)。
不像其它语言(例如 C 语言),需要手动释放内存。
Java 的垃圾收集器是一个在后台运行的程序,它检查所有在内存中运行的对象,
并找出那些不再在程序中的任何地方引用到的对象。
这些对象将被声明为程序运行垃圾,以释放其所占的内存,为其它对象继续使用。
GC 的运行步骤:
1、Marking(标记):
这是GC工作的第一步。鉴定出不再使用的对象,并对其进行标记。
2、Normal Deletion(一般化删除):
移除不使用的对象,并释放其所占空间。
3、Deletion with Compacting(压缩删除):
在删除所有不再使用的对象后,所有未被删除的对象将被移动到一起。
这样可以提高对 new Objects 分配内存时的性能。
这种简单的 Mark 然后 delete 的方式有两点不足:
1、不高效。新对象刚创建完,还没有被引用时就被删除了。
2、重复。那些即使一直被程序引用的对象,也要在每次的GC轮询中被检查。
-
转载请注明,
原文出处:http://lixh1986.iteye.com/blog/2351465
-
引用:
http://www.journaldev.com/2856/java-jvm-memory-model-memory-management-in-java
http://stackoverflow.com/a/4848711/2893073
http://www.cubrid.org/blog/dev-platform/understanding-java-garbage-collection
发表评论
-
java 将文件夹所有的文件合并到指定的文件夹下
2020-06-30 19:17 1064场景:将文件夹所有的文件合并到指定的文件夹下 另外:如果想效 ... -
多线程-线程池的四种创建方式
2020-04-01 18:38 488多线程-线程池的四种创建方式 https://blog.cs ... -
Java基础之:nio
2019-11-13 15:38 482一、理论讲解: 史上最强Java NIO入门:担心从入门到放弃 ... -
Java 分布式之:RPC 基本概念
2019-11-13 15:07 462转载: https://www.jianshu.com/p/ ... -
Java之 volatile 关键字原理详解
2019-11-07 15:36 547一、什么是 volatile ? ... -
POI实现excell批注背景图片(仿html浮窗显示图片)
2019-10-21 08:17 690POI实现excell批注背景图片(仿html浮窗显示图片) ... -
Java之设计模式之 Observer 观察者
2019-07-04 17:21 1070观察者设计模式 Java 已经实现了该模式,并且提供了使用类 ... -
HashMap, LinkedHashMap and TreeMap
2019-03-01 11:04 680https://stackoverflow.com/a/177 ... -
Java lib 操作 excel 插入图片
2019-01-19 12:46 880https://poi.apache.org/componen ... -
数据库连接池C3P0
2018-05-29 16:50 896一、名字的由来 很多 ... -
Java8之集合(Collection)遍历 forEach()、stream()
2018-05-29 14:39 20750package java8.collections; ... -
Junit Vs main on "java.util.concurrent.Executors"
2017-11-10 16:44 815Same code with different result ... -
Java之大数据学习路线
2017-11-03 10:08 5722三个月大数据研发学习 ... -
Java中创建对象的5种方式
2017-10-26 14:21 842一、Java之5种创建对象的方式 ————————————— ... -
Log4j和Slf4j的比较
2017-06-23 12:41 1411一直搞不清 Log4j 和 SLF4j 的关系。今天才若有所 ... -
Java之Java7新特性之try资源句式
2017-04-20 14:58 5385Java之Java7新特性之try资源句式 一、【try资源 ... -
Java之 java.util.concurrent 包之ExecutorService之submit () 之 Future
2017-03-04 21:27 3834一、如何使用 ExecutorService.submit() ... -
Java之 java.util.concurrent 包之Executor与ExecutorService
2017-03-04 21:18 2704一、问题: execute() 与 submit() 的区别? ... -
JAVAEE之单用户登录
2017-02-05 11:55 1058单用户登录是系统中数据一直性的解决方案之一。 问题背景: 试 ... -
Java之多线程之线程池之线程重复使用
2017-02-04 13:33 5568一、问题背景 在使用多线程时,如果要开启一个任务,则就需要新 ...
相关推荐
在Java内存模型中,堆被分为两个主要部分:青年代(Young Generation Space)和终身代(Tenured Generation Space),即“新生代”和“老年代”。 青年代是新创建的对象存放的地方,其中包括Eden区和Survivor区。...
- 理解Java内存模型(堆、栈、方法区等)对使用内存分析工具至关重要。 总之,HeapAnalyzer是Java开发者处理内存溢出问题的强大助手。通过熟练掌握其使用,我们可以有效地定位并解决内存问题,提升应用的稳定性和...
- **Java内存模型**:包括堆内存、栈内存、方法区、本地方法栈和程序计数器等部分。 - **垃圾回收(GC)原理**:了解如何自动回收不再使用的对象,以及不同垃圾收集器的工作机制。 - **内存泄漏**:理解内存泄漏...
Java内存模型中另一个重要的组成部分是堆(Heap)和栈(Stack)。 - **堆**:用于存储对象实例。每个对象都位于堆上的某个位置,而对象的引用则存储在线程的本地栈中。堆空间由垃圾回收器管理,以释放不再使用的...
本文将深入探讨Java中堆内存与栈内存的分配机制,并通过对比分析它们之间的差异,帮助读者更好地掌握Java内存管理的核心概念。 #### 二、堆内存与栈内存概述 ##### 1. 堆内存 堆内存是Java虚拟机(JVM)用于存储...
Java虚拟机(JVM)内存模型是Java编程语言的核心组成部分,它定义了程序运行时的数据区域和内存管理方式。深入理解这一模型对于优化Java应用程序性能、避免内存泄漏以及理解线程安全至关重要。以下是对Java虚拟机...
标题和描述中提及的知识点主要围绕Java内存模型(JMM),JVM内存结构,包括堆栈讲解,以及本机内存管理等内容。以下是对这些知识点的详细阐述: ### Java内存模型(JMM) #### JMM简介 Java内存模型(JMM)是Java虚拟机...
Java内存分为堆(Heap)、方法区(Method Area)、栈(Stack)、本地方法栈(Native Method Stack)和程序计数器(PC Register)五大部分。HeapAnalyzer主要关注的是堆内存,特别是新生代(Young Generation)、老...
### Java 虚拟机JVM内存模型知识点 #### 1. JVM概述 ##### 1.1 Java的特性与JVM的应用 Java语言的特性包括跨平台性、面向对象、安全性等。JVM是Java程序能够跨平台运行的关键,它负责将Java源代码转换成与平台无关...
Java内存模型是Java平台的核心概念之一,它定义了Java程序中各种变量的访问规则以及如何在运行时分配内存区域给对象。Java内存模型的深入分析对于编写高性能的Java应用程序至关重要,本文将详细探讨Java内存模型的...
Java内存模型将内存划分为几个区域,主要包括堆(Heap)、栈(Stack)、方法区(Method Area)、程序计数器(Program Counter Register)、本地方法栈(Native Method Stack)和虚拟机栈(Java Virtual Machine ...
Java内存模型(Java Memory Model,JMM)是Java平台中的一种规范,它定义了线程如何访问和修改共享变量,以及在多线程环境中如何保证数据一致性。JMM的主要目标是解决多线程环境下的可见性、有序性和原子性问题。 ...
Java虚拟机(JVM)内存模型是Java虚拟机的核心组件之一,它定义了Java程序在运行时的内存布局和管理方式。JVM内存模型主要分为五个部分:程序计数器、虚拟机栈、本地方法栈、堆、方法区。 1. 程序计数器(Program ...
Java 实现内存动态分配主要涉及Java内存模型以及内存管理机制,包括堆内存和栈内存的分配,以及垃圾回收等概念。下面将详细解释这些知识点。 1. **Java内存模型** Java程序运行时,内存分为堆内存(Heap)和栈内存...
为了解决这个问题,我们需要深入理解Java内存模型以及如何调整JVM的内存设置。Java内存主要分为三个区域:堆(Heap)、栈(Stack)和方法区(Method Area),其中堆是用于存储对象实例的主要区域,当堆空间不足时,...
Java虚拟机内存区域模型是Java虚拟机管理的内存区域模型,该模型将内存区域分为程序计数器、虚拟机栈、本地方法栈、堆和方法区五个部分。程序计数器是一块较小的内存空间,用于记录当前线程执行的字节码指令地址。...
在Java内存模型中,堆内存和栈内存是两个核心概念。堆内存主要存放对象的实例,所有通过new创建的对象都会在堆内存中分配空间。而栈内存是存放基本类型和对象引用的地方。 在Java中,内存管理由Java虚拟机(JVM)...
Java内存模型是共享内存的并发模型,线程之间主要通过读-写共享变量(堆内存中的实例域、静态域和数组元素)来完成隐式通信。JMM控制Java线程之间的通信,决定一个线程对共享变量的写入何时对另一个线程可见。 2. ...