重新理解jvm运行时的内存分布(堆栈方法区交互)

重新理解jvm运行时的内存分布(堆栈方法区交互),第1张

栈堆方法区的交互关系

java栈存储的本地变量表,包括八种数据类型和引用类型,引用类型指向对象的地址,保存在reference,指向java堆,对象类型数据会保存变量名,变量类型,变量值等,这些会存在方法区中去查看(在初始化的时候)。

在java栈中会存放对象实例(s1),但是他对象实例中具体的数据会由java栈中的引用指向java堆中的地址,里面的对象实例数据存放(实例名,实例相关类型,元数据信息。。。。),而静态变量,常量,类加载后的信息等会存放在方法区,在运行时需要调用的时候去方法区取,所以方法区和java堆都是共享的。而java栈时线程独有的数据(包括程序计数器,本地方法栈)。

一个jvm实例,只存在一个堆内存,堆内存的大小是可以调节的。类加载器读取了类文件之后,需要把类,方法,常量放到堆内存中,保存所有的引用类型的真实信息,以方便执行器执行。堆内存分为三部分。

(养老区就是老年代)

堆内存 逻辑上 分为三部:新生 +养老 +方法区

eden+survivor+Spaces(元空间或者叫方法区或者Perm)

Perm 永久存储区,是一个常驻内存的区域,用于存放jdk自身携带的Class,Interface的元数据,被装载进此区域的数据是不会被垃圾回收器回收的,只有关闭jvm后才会释放此区域所占用的内存。

如果出现OutOfMemoryReeor: PermGen space 说明java虚拟机堆永久带Perm内存设置不够,一半出现这种情况,都是程序启动加载大量第三方jar呆滞的,

对于HotSpot虚拟机很多开发者习惯将方法区称之为永久代(Parmenent

Gen),永久代是方法区的一个实现,这是不对的,方法区是逻辑上的部分。在jdk7中已经将原本放在永久代的字符串常量池移走了。

常量池( Constant Pool Constant PoolConstant Pool Constant Pool Constant Pool )是方法区的一部分, Class Class文件除了有类的版本、 字段方法、接口等描述信息外,还有一项就是常量池这部分内容将在类加载后进入。

伊甸园区,所有对象刚new出来都会放在这里。

对象分两种:

1如果是大对象直接分配在Old区。

2如果禁言了逃逸分析,会在栈上分配。

以上两种都不符合,放入伊甸园区。(Eden区)

看java7中如图:

对比java8

首先你要明白一点,不管我们安装什么应用也好,系统也好,软件也好,都必须是安装到一个存储介质上的,也就是硬件上面

你的手机安装java程序,是安装到手机的存储空间上的,一般手机可能自带这个存储空间,也可以安装到sd卡(这个卡通常叫内存卡)上

比如mp3他也是存放到这些存储介质上的,一般存储介质能存放多少内容是根据它的规格来的

假如你手机中有一张8G卡,可以安装java程序,也可以安装mp3等等内容

存放这些数据的单位关系如下:

1024KB=1MB

1024MB=1GB

你问到的MB其实就是指占用了多少内存卡的空间

如果按一首mp3大约5MB来算的话,一张8GB卡可以存放 81024/5=16384 首mp3

所有程序必须在关闭后才能正常卸载。有一些常驻内存的程序尤其要关闭后才能卸载,否则将会出现错误。正常安装的程序请到程序管理中的列表里找到后卸载。如果是手动安装的程序,手动进入相应目录,进行手动删除。以下为详细删除方法,希望能帮到你。。。

1、软件的删除方法:

a常规删除方法: 新手必看

方法1设置--->数据管理--->程序管理--->选择你要卸载的软件--->左软键选择删除--->依提示进行 *** 作

方法2选中你要删除的软件图标--->左软键选择删除--->依提示进行 *** 作

方法3选中你要删除的软件图标--->直接按C键--->依提示进行卸载(此方法是S60V3手机独有的最简单的删除方法,推荐使用)

b如何删除在程序管理里无法正常卸载的软件?

某些软件运行时在任务栏列表中是不可见的,而是以进程的方式在后台运行,常见的有来电防火墙、短信防火墙类软件、杀毒软件、加密软件、手机锁、字体等所有开机自启动的软件等需要实时监控的软件,因此,当然无法删除正在运行中的软件。就象我们用计算机时,如果打开一个文件,并不关闭它,想删除它就是不行的一样。

解决方法为:

用论坛里提供的进程管理器(如文件动力、进程管理软件等)查看进程表,如你能判断哪个线程是该程序的进程,则可以关闭它,如无法判断则可以先设置不显示系统进程,然后关闭所有的非系统进程,这样就可以到程序管理里正常卸载软件了。

修改文件名或是属性后删除。

修改文件所在的文件夹名,再重启后就可用第1或第2种方法进行删除。

c无法删除软件的问题解决---用读卡器删除:

如安装软件后无法删除可用读卡器打开E盘(SD卡),\sis\uninstall\ 目录下有很多文件夹如:20000555_00000000再打开此这些文件夹里面有还E文件夹,里面有个log文件内容如下::\sys\install\sisregistry\20000555 \00000000_0000ctl

de:\sys\bin\screenshotexe

|e:\resource\apps\Screenshotmif

|e:\resource\apps\Screenshotrsc

:\private\10003a3f\import\apps\Screenshot_regrsc

Pe:\private\20000555\

在这文件里面有软件安装的路径,找到这些文件后将其删除。再删除C:\PreinstalledAppscachedat文件删除。再看看功能表有没有该图标。从:\sys\install\sisregistry\20000555\00000000_0000ctl可以看出图标文件存放在C这里。用Y-管理器删除C盘下整个SYS文件夹,重新启动。

d无法删除jar格式软件或游戏的解决方法

s60第三版的系统在安装一个jar格式的软件或游戏时,如aaajar,会在X:\PRIVATE\102033E6\MIDlets(X为电脑上你的存储卡的盘符,必须要用读卡器在电脑上才可以看到)目录下建立一个带中括号的文件夹,比如[10168f78],里面会有与安装文件同名的aaajar以及uids两个文件,安装的同时还会在X:\System\Install\Registry下产生与上面这个中括号文件夹同名的注册文件10168f78reg。

在不能正常删除这个软件时,只要在X:\PRIVATE\102033E6\MIDlets目录里删除该软件的目录[10168f78],再将X:\System\Install\Registry里面相应的10168f78reg删除就可以了!

你安装了几个jar格式的软件或游戏,X:\PRIVATE\102033E6\MIDlets里面就有几个带中括号的文件夹,一定要打开看看里面的文件名是否你要删除那个噢!

有时候X:\System\Install\Registry里面可能找不到相应的reg文件,不用管它了,把X:\PRIVATE\102033E6\MIDlets里面带中括号的文件夹删除就可以了!

在使用 Eclipse 编写 Java 源程序时,程序保存在硬盘上,而不是内存中。当您点击“保存”按钮时,Eclipse 会将程序源代码写入硬盘上的文件。此外,Eclipse 还提供了一些自动保存选项,可以在编写程序时定期保存代码,以防止数据丢失。

以上就是关于重新理解jvm运行时的内存分布(堆栈方法区交互)全部的内容,包括:重新理解jvm运行时的内存分布(堆栈方法区交互)、手机上java程序占用什么内存、我的手机安装JAVA软件后无法卸载了等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10119044.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存