简化Java内存分析

作为一名典型的Java开发人员,除了遵循关闭连接,流等典型的最佳实践外,我从未监视过应用程序的内存使用情况。最近,我们在JBoss服务器中遇到了一些问题,不得不深入研究内存管理Java中最好的事情之一是,创建对象时,不需要开发人员处理内存分配。 JVM为我们做到了。 大多数时候,我们只需要堆内存和垃圾收集器的外层知识。 我将分享一些非常有趣的调查。 我是一个巨大的话题,我是从Web应用程序开发人员的角度写的,我认为我们应该了解的所有最低要求。 工具

有很多不错的工具可用来剖析Java应用程序,其中一些是,

1. 您的套件Java Profiler
2. JProfiler
3. Eclipse MAT 4. 可视VM

其中,您的工具包和JProfilers需要许可证,其他则可以免费使用产品。 我们将使用VisualVM。 它是一个简单但功能强大的工具,并捆绑在JDK中。 它具有可下载和使用的插件功能列表。 要开始使用VisualVM,请转到<JDK_HOME> \ bin并运行jvisualvm.exe 。 我发现以下文章对继续学习很有用。

1. 使用VisualVM进行分析
2. VisualVM性能调整工具
3. 如何在不崩溃的情况下获取VisualVM来配置JBoss

由于我们在这里讨论内存,因此请确保按照本文所述,在VisualVM上安装Visual GC插件。

设置阶段– JVM内存结构

JVM内存分为三部分,如下图所示。 在我们的应用程序中,我们关注堆内存。 我们可以使用参数将此值输入到JVM,

-Xmx <size> –设置最大Java堆大小
-Xms <size> –设置初始Java堆大小

非堆内存存储每个类的结构,例如运行时常量池,字段和方法数据,以及方法和构造函数的代码以及内部字符串。

这是一篇不错的文章,其中包含有关JVM内存大小的更多详细信息。 在这里阅读Javin关于JVM堆空间的文章。

一种常见的混淆是关于堆栈内存和堆内存 。 此处对此进行了很好的解释。堆栈值仅存在于创建它们的函数范围内。一旦返回,它们将被丢弃。 Java仅将原语存储在堆栈中。 这样可使堆栈变小,并有助于使单个堆栈帧变小,从而允许更多的嵌套调用。 对象是在堆上创建的,并且只有引用(即原语)在堆栈上传递。

现在,让我们变得真实。 在Visual GC的图像下方给出,这是前面提到的VisualVM内部的一个插件。 我们在这里看到许多图形输出的详细能解密,请点击这里 。

游戏开始–应用程序运行时会发生什么

创建对象时,它们位于Eden内部。 运行垃圾收集器(GC)时,如果对象已死(意味着它们不是活动引用),则将其清除,否则将其移至S1 (生存空间1)或S2 这称为GC循环。 内部GM算法确定GC循环的频率。 堆内存的Eden + S1 + S2部分称为Young generation。 在固定数量的GC循环中幸存下来的对象将移入“ 旧一代”空间。 大多数Java对象死于婴儿,并且永远都不会到达OldGen。这通常包括局部变量,这些局部变量在方法执行后会刷新。

老一代内部的GC循环频率比年轻一代要少得多。老一代对象的典型示例是单例,缓存的对象和其他应用程序广泛使用的数据。

当事情没有按照计划进行时

在典型的应用中,Old Gen空间内部的变化较小。 如果即使在GC周期之后,Old Gen空间也随着时间线性增长,则将导致OutOfMemoryError。 这可能表明代码内有内存泄漏。 但是,我们可能需要使用探查器来找出造成这种情况的确切原因。 这是Dzon上有关Java EE企业性能问题的某些原因的文章。

这些是执行应用程序时JVM内存的组织方式和反应的基本构建块。 从这一点开始,有很多主题,包括调整内存参数和垃圾收集器。 我将添加一些与此相关的有用资源。

1. Java性能调优,性能分析和内存管理
2. InfoQ演示:诊断Web应用程序内存不足错误
3. InfoQ演示:我所学到的有关JVM性能调整@twitter的一切 4. InfoQ演示:极限性能Java 5. Java理论与实践:垃圾收集与性能

参考: Java内存概要分析(由Java的JCG合作伙伴 Manu PK 简化 ,位于“面向对象的生活”博客中)。


翻译自: https://www.javacodegeeks.com/2012/09/java-memory-model-simplified.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/371281.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

nyoj 1129 Salvation 模拟

思路&#xff1a;每个坐标有四种状态&#xff0c;每个点对应的每种状态只能走一个方向&#xff0c;如果走到一个重复的状态说明根本不能走到终点&#xff0c;否则继续走即可。 坑点&#xff1a;有可能初始坐标四周都是墙壁&#xff0c;如果不判断下可能会陷入是死循环。 贴上测…

详解mysql数据库的启动与终止_详解MySQL数据库的启动与终止(一)

由于MySQL服务器具有多种安装分发&#xff0c;而且能够运行在多种操作平台之上&#xff0c;因此它的启动与停止的方法也多种多样。你可以根据实际情况使用其中的一种。在你安装、升级或者维护系统时&#xff0c;你可能需要多次启动和终止服务器&#xff0c;你需要了解启动和终止…

easyui 插入中间行

function inserrow() {var index_dx 0;var index_lt 0;var rows $(#dg).datagrid(getRows)//获取当前的数据行前期数据准备for (var i 0; i < rows.length; i) {if (rows[i][运营商] 电信) {index_dx i;dxptjss_dx parseInt(rows[i][短信平台接收数]);} else {index_…

使用JNA的透明JFrame

在“ 使JFrame透明”中&#xff0c;我展示了一种使用AWTUtilities类使框架透明的方法。 但是使用该类会导致访问限制编译时错误&#xff0c;该文章中还显示了Eclipse中的解析。 现在&#xff0c;这里是使用Java本机的版本。 我使用Java本机访问&#xff08;JNA&#xff09;库来…

Problem: Query on the tree(二分+划分树)

题目链接&#xff1a; Problem: Query on the tree Time limit: 1s Mem limit: 64 MB Problem DescriptionThere is a tree with n node, labeled from 1 to n, and the root of the tree is 1. For every node i, if its father is j, its value vivj*i%20161119, the…

day04_09 while循环03

练习题: 3.如何输入一个如下的直角三角形,用户指定输出行数:(如果上下反转,右如何实现?) ********** 以下是自己的思路,没有按照上课老师的思路,反正经过不断的测试改进得出的算法 num int(input("请输入行数")) line 1 while line < num1:lie 1 while lie &l…

idal 创建springboot 项目_手把手的SpringBoot教程,SpringBoot创建web项目(四)

在实际的开发过程中&#xff0c;我们需要前端页面向Java端提交请求&#xff0c;这些请求一般分为get方式和post方式&#xff0c;不管是哪一种方式&#xff0c;一般都会携带一些参数。这一节&#xff0c;我们来演示一下如何给Controller传递参数。代码&#xff1a;RestControlle…

JavaOne 2012:Lambda之路

我最热切期待的JavaOne 2012演讲之一是Brian Goetz的“通往Lambda的道路”。 昨晚的技术主题演讲中的Lambda味道仅增加了预期。 这是在希尔顿广场A / B举行的&#xff0c;距离我上次在金门大桥A / B / C参加的演讲仅几步之遥。 我原本希望打包相对较大的Plaza A / B&#xff08…

沉浸式go-cache源码阅读!

大家好&#xff0c;我是豆小匠。 这期来阅读go-cache的源码&#xff0c;了解本地缓存的实现方式&#xff0c;同时掌握一些阅读源码的技巧~ 1. 源码获取 git clone https://github.com/patrickmn/go-cache.git用Goland打开可以看到真正实现功能的也就两个go文件&#xff0c;ca…

CoreAnimation 变换

CoreAnimation 变换 CoreAnimation 目录 博客园MakeDown支持不佳,如有需要请进GitHub 本片博客主要内容: 仿射变换 - CGAffineTransform3D变换 - CATransform3D仿射变换 - CGAffineTransform CGAffineTransform 是用于二维空间的旋转,缩放和平移的属性.首先展示一个简单的样例,…

20170907wdVBA_GetCellsContentToExcel

WORD 加载项 代码模板 Dim cmdBar As CommandBar, cmdBtn As CommandBarControl Const cmdBtnCap As String "批量提取操作步骤"Sub AutoExec()Call DelCmdBtnCall AddCmdBtnEnd Sub Sub AutoExit()Call DelCmdBtn End SubSub AddCmdBtn()Set cmdBar Application.C…

mysql 5.7 mirror_Centos7 Docker离线部署Mysql5.7

1 环境信息查看系统内核[rootlocalhost /]# cat /etc/redhat-releaseCentOS Linux release 7.5.1804 (Core)2 虚拟机拉取镜像此处资源获取在虚拟机中进行&#xff0c;完成后上传到服务器安装2.1 拉取mysql5.7镜像[rootlocalhost /]# docker pull mysql:5.72.2 导出镜像[rootloc…

Java中的简单REST客户端

如今&#xff0c;大多数用于与某些服务器通信的移动应用程序都使用REST服务。 这些服务也是与JavaScript或jQuery一起使用的常见做法。 现在&#xff0c;我知道在Java中为REST服务创建客户端的2种方法&#xff0c;在本文中&#xff0c;我将尝试演示这两种方法&#xff0c;希望它…

3.20 下午

阅读《艺术学概论》 戏剧冲突是戏剧的灵魂 冲突包括&#xff1a;人物性格的冲突、行为的冲突、 思想感情的冲突乃至心理状态的冲突等等 转载于:https://www.cnblogs.com/bgd140206110/p/6590005.html

华为root工具_华为Mate9解锁后无法ROOT 需要手动刷入Recovery怎么办【解决方法】...

很多朋友手机到手之后&#xff0c;都希望能够ROOT使用更多的系统功能。近日有网友向小编询问&#xff0c;为何华为Mate9解锁后无法ROOT&#xff0c;明明已经通过官方的解锁教程解锁的&#xff0c;但是之后使用“大师”等第三方刷机工具&#xff0c;无法ROOT。其实ROOT的关键就在…

JAX-WS入门

JAX-WS代表XML Web Services的Java API。 它是一种Java编程语言API&#xff0c;用于创建Web服务和使用XML进行通信的客户端。 这篇文章是JAX-WS的快速入门。 先决条件 GlassFish与Eclipse集成在一起 。 创建JAX-WS Web服务 1.在Eclipse中创建一个名为“ com.eviac.blog.jax…

canvas 图片反色

代码实例&#xff1a; <!DOCTYPE HTML> <html> <head><meta charset"utf-8"><title>图片反色</title><style type"text/css">body{ background:black;}#c1{ background:white;}</style><script type&q…

python中的文件父路径怎么表达_python中的文件父路径怎么表达_如何在Python中访问父目录...

所以我有一个朋友给我的Python脚本&#xff0c;但是我没有Python的经验。代码如下&#xff1a;from os import path, chdir, listdir, mkdir, getcwdfrom sys import argvfrom zipfile import ZipFilefrom time import sleep#Defines what extensions to look for within the f…

Maven的中央仓库地址

www.mvnrepository.com转载于:https://www.cnblogs.com/j-liu3323/p/6590435.html

Spring–添加AOP支持

我听到了一个有关一位高级&#xff08;且酬劳颇丰&#xff09;软件工程师的故事。 他的任务是记录他正在研究的项目中每个控制器中的每个方法。 工程师重写了所有控制器方法&#xff0c;因此使用如下代码&#xff1a; RequestMapping(method RequestMethod.GET)public String …