包含java8内存结构图的词条
本篇文章给大家谈谈java8内存结构图,以及对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
- 1、java 两个for循环内存图 菜鸟求高手画个来看看方便理解
- 2、javaint[] arr = {1, 12, 3, 1, 5, 1, 2, 4, 5, 6, 3, 12, 1, 8, 7 , 7, 8, 3, 4};
- 3、常用JVM参数(JDK 8)
- 4、怎样查看JAVA内存的大小?
- 5、java内存模型,年轻代为什么分为8比1
- 6、java学习有什么好书
java 两个for循环内存图 菜鸟求高手画个来看看方便理解
数组是3行3列共9个元素
1,2,3
4,5,6,
7,8,9
arr.length=3(数组有3行)
而且每一行里的元素个数也是3 (arr[x].length=3)
2个for循环可以分外层和里层
外层循环第一轮 x=0; 0arr.length=3 即 03 成立
所以执行循环体。
循环里面也是一个循环。里层循环
里层循环第1轮 y=0;y arr[0].length=3 即 03 成立。
所以执行里层循环体的第一轮内部
打印 arr[0][0] 即 1
y++ y--1
里层循环第2轮 y=1;y arr[0].length=3 即 13 成立。
所以执行里层循环体的第一轮内部
打印 arr[0][1] 即 2
y++ y--2
里层循环第一轮 y=2;y arr[0].length=3 即 23 成立。
所以执行里层循环体的第一轮内部
打印 arr[0][2] 即 3
y++ y--3
3不小于3 所以里层循环退出
x++ x--1
进入外层循环的第2轮。依次类推即可。
javaint[] arr = {1, 12, 3, 1, 5, 1, 2, 4, 5, 6, 3, 12, 1, 8, 7 , 7, 8, 3, 4};
int (*ptr)[3]=a这句,将a的首地址赋值给了ptr,ptr表示的是指向一个含有三个Int的数组的指针,*((ptr+1)[2])等价于*((ptr+1)+2),等价于*(ptr+3),这表示从数组a的首地址向后移动3个单位,每个单位为一个含有3个Int的数组,所以一共向后移动了9个单位,即得出运行结果10!要想正确表达a[1][2],应该是(*(ptr+1))[2],数组的运算符[ ]比间值运算符*的优先级高,(*(ptr+1))[2]表示a向后移动一个单位即三个Int,此时ptr指向4,再往后移动2个Int指向6。其实遇到这类问题画内存结构图比较容易理解了
常用JVM参数(JDK 8)
-Xss :线程栈空间
-Xms : 初始堆空间,如: -Xms512M
-Xmx : 最大堆空间,如: -Xmx512M
-XX:MinHeapFreeRatio : 堆空间最小空闲比,当堆空间空闲内存小于这个数值时,JVM会扩展堆空间。
-XX:MaxHeapFreeRatio : 堆空间最大空闲比,当堆空间空闲内存大于这个数值时,JVM会压缩堆空间,得到一个较小的堆。
-XX:NewSize : 新生代初始空间
-XX:MaxNewSize : 最大新生代空间
-Xmn : 相当于设置相同的 -XX:NewSize 和 -XX:MaxNewSize .
-XX:SurvivorRatio : 新生代中eden空间和s0空间的比例
-XX:TargetSurvivorRatio : survivor区的可使用率,当survivor区的空间使用率达到这个数值时,会将对象送入老年代。
-XX:NewRatio : 老年代 / 新生代的空间比例
-XX:MetaspaceSize=512m : 分配给类元数据空间的初始大小,以bytes为单位,达到该值就会触发垃圾收集进行类型卸载,同时GC会对该值进行调整:如果释放了大量的空间,就适当的降低该值;如果释放了很少的空间,那么在不超过MaxMetaspaceSize(如果设置了的话),适当的提高该值。
-XX:MaxMetaspaceSize=512m : 分配给类元数据空间的最大值, 超过此值就会触发Full GC. 此值仅受限于系统内存的大小, JVM会动态地改变此值
-XX:MinMetaspaceFreeRatio ,在GC之后,最小的Metaspace剩余空间容量的百分比,减少为class metadata分配空间导致的垃圾收集。
-XX:MaxMetaspaceFreeRatio ,在GC之后,最大的Metaspace剩余空间容量的百分比,减少为class metadata释放空间导致的垃圾收集。
-XX:CompressedClassSpaceSize=512m : 类指针压缩空间大小, 默认为1G
-XX:+PrintGCDetails : 打印GC细节
-XX:+PrintGC :
-XX:+PrintGCTimeStamps :
-XX:+PrintHeapAtGC :
Java 8 以前的JVM内存结构图:
其中:
虚拟机栈 在运行时使用 栈帧 保存上下文,栈帧中存储了以下内容:
更为精细地, 堆 和 方法区 的结构如下:
堆 分为 新生代 和 老年代 .
新生代 分为 Eden区 、 s0区(survivor space0或from space) 和 s1区(survivor space1或to space) 。
大部分新创建的对象进入Eden区,幸存区s0区和s1区存放经历了至少一次GC的“幸存者”。如果幸存区中的对象到了指定年龄仍未被回收,则有机会进入 老年代(tenured)
对于习惯了HotSpot虚拟机的程序员来说,很多都愿意将 方法区 称作 永久代 。本质上来讲两者并不等价,仅因为Hotspot将GC分代扩展至方法区,或者说使用永久代来实现方法区。在其他虚拟机上是没有永久代的概念的。也就是说方法区是Java虚拟机规范,永久代是Hotspot针对该规范进行的实现。
堆 和 方法区 都是被JVM中所有线程共享的。
Java 8以后的JVM内存结构图:
Java8中,Hotspot取消了永久代,永久代的参数 -XX:PermSize 和 -XX:MaxPermSize 也随之失效。
对于Java8,HotSpots取消了永久代,是不是就没有方法区了呢?当然不是,方法区只是一个规范,只不过它的实现变了。
在Java8中, 方法区存在于元空间(Metaspace) 。同时,元空间不再与堆连续,而且是存在于本地内存(Native memory)。
本地内存(Native memory) ,也称为 C-Heap ,是供JVM自身进程使用的。当Java Heap空间不足时会触发GC,但本地内存空间不够却不会触发GC。
元空间存在于本地内存,意味着只要本地内存足够,它不会出现像永久代中 java.lang.OutOfMemoryError: PermGen space 这种错误。默认情况下元空间是可以无限使用本地内存的,但JVM同样提供了参数 -XX:MaxMetaspaceSize 来限制它使用的空间。
怎样查看JAVA内存的大小?
首先先说一下JVM内存结构问题,JVM为两块:PermanentSapce和HeapSpace,其中
Heap = }。PermantSpace负责保存反射对象,一般不用配置。JVM的Heap区可以通过-X参数来设定。
当一个URL被访问时,内存申请过程如下:
A. JVM会试图为相关Java对象在Eden中初始化一块内存区域
B. 当Eden空间足够时,内存申请结束。否则到下一步
C. JVM试图释放在Eden中所有不活跃的对象(这属于1或更高级的垃圾回收), 释放后若Eden空间仍然不足以放入新对象,则试图将部分Eden中活跃对象放入Survivor区
D. Survivor区被用来作为Eden及OLD的中间交换区域,当OLD区空间足够时,Survivor区的对象会被移到Old区,否则会被保留在Survivor区
E. 当OLD区空间不够时,JVM会在OLD区进行完全的垃圾收集(0级)
F. 完全垃圾收集后,若Survivor及OLD区仍然无法存放从Eden复制过来的部分对象,导致JVM无法在Eden区为新对象创建内存区域,则出现”out of memory错误”
JVM调优建议:
ms/mx:定义YOUNG+OLD段的总尺寸,ms为JVM启动时YOUNG+OLD的内存大小;mx为最大可占用的YOUNG+OLD内存大小。在用户生产环境上一般将这两个值设为相同,以减少运行期间系统在内存申请上所花的开销。
NewSize/MaxNewSize:定义YOUNG段的尺寸,NewSize为JVM启动时YOUNG的内存大小;MaxNewSize为最大可占用的YOUNG内存大小。在用户生产环境上一般将这两个值设为相同,以减少运行期间系统在内存申请上所花的开销。
PermSize/MaxPermSize:定义Perm段的尺寸,PermSize为JVM启动时Perm的内存大小;MaxPermSize为最大可占用的Perm内存大小。在用户生产环境上一般将这两个值设为相同,以减少运行期间系统在内存申请上所花的开销。
SurvivorRatio:设置Survivor空间和Eden空间的比例
内存溢出的可能性
1. OLD段溢出
这种内存溢出是最常见的情况之一,产生的原因可能是:
1) 设置的内存参数过小(ms/mx, NewSize/MaxNewSize)
2) 程序问题
单个程序持续进行消耗内存的处理,如循环几千次的字符串处理,对字符串处理应建议使用StringBuffer。此时不会报内存溢出错,却会使系统持续垃圾收集,无法处理其它请求,相关问题程序可通过Thread Dump获取(见系统问题诊断一章)单个程序所申请内存过大,有的程序会申请几十乃至几百兆内存,此时JVM也会因无法申请到资源而出现内存溢出,对此首先要找到相关功能,然后交予程序员修改,要找到相关程序,必须在Apache日志中寻找。
当Java对象使用完毕后,其所引用的对象却没有销毁,使得JVM认为他还是活跃的对象而不进行回收,这样累计占用了大量内存而无法释放。由于目前市面上还没有对系统影响小的内存分析工具,故此时只能和程序员一起定位。
2. Perm段溢出
通常由于Perm段装载了大量的Servlet类而导致溢出,目前的解决办法:
1) 将PermSize扩大,一般256M能够满足要求
2) 若别无选择,则只能将servlet的路径加到CLASSPATH中,但一般不建议这么处理
3. C Heap溢出
系统对C Heap没有限制,故C Heap发生问题时,Java进程所占内存会持续增长,直到占用所有可用系统内存
参数说明:
JVM 堆内存(heap)设置选项
参数格式
说 明
设置新对象生产堆内存(Setting the Newgeneration heap size)
-XX:NewSize
通过这个选项可以设置Java新对象生产堆内存。在通常情况下这个选项的数值为1 024的整数倍并且大于1MB。这个值的取值规则为,一般情况下这个值-XX:NewSize是最大堆内存(maximum heap size)的四分之一。增加这个选项值的大小是为了增大较大数量的短生命周期对象
增加Java新对象生产堆内存相当于增加了处理器的数目。并且可以并行地分配内存,但是请注意内存的垃圾回收却是不可以并行处理的
设置最大新对象生产堆内存(Setting the maximum New generation heap size)
-XX:MaxNewSize
通过这个选项可以设置最大Java新对象生产堆内存。通常情况下这个选项的数值为1 024的整数倍并且大于1MB
其功用与上面的设置新对象生产堆内存-XX:NewSize相同
设置新对象生产堆内存的比例(Setting New heap size ratios)
-XX:SurvivorRatio
新对象生产区域通常情况下被分为3个子区域:伊甸园,与两个残存对象空间,这两个空间的大小是相同的。通过用-XX:SurvivorRatio=X选项配置伊甸园与残存对象空间(Eden/survivor)的大小的比例。你可以试着将这个值设置为8,然后监控、观察垃圾回收的工作情况
设置堆内存池的最大值(Setting maximum heap size)
-Xmx
通过这个选项可以要求系统为堆内存池分配内存空间的最大值。通常情况下这个选项的数值为1 024的整数倍并且大于1 MB
一般情况下这个值(-Xmx)与最小堆内存(minimum heap size –Xms)相同,以降低垃圾回收的频度
取消垃圾回收
-Xnoclassgc
这个选项用来取消系统对特定类的垃圾回收。它可以防止当这个类的所有引用丢失之后,这个类仍被引用时不会再一次被重新装载,因此这个选项将增大系统堆内存的空间
设置栈内存的大小
-Xss
这个选项用来控制本地线程栈的大小,当这个选项被设置的较大(2MB)时将会在很大程度上降低系统的性能。因此在设置这个值时应该格外小心,调整后要注意观察系统的性能,不断调整以期达到最优
最后说一句,你的机器的连接数设置也至关重要,连接的关闭最好把时间设置的少些,那些连接非常耗费资源。也是引起内存泄露的主要原因。
java内存模型,年轻代为什么分为8比1
了解java内存模型对深入了解jvm有很多好处。JMM通过控制主内存与每个线程的本地内存之间的交互,来为开发者提供内存可见性保证。
java学习有什么好书
《Java核心编程》
这 本书是与《Java编程思想》并列的两本最好的书,但《Java核心编程》更注重于图形方面的编程,比如说Swing/Awt。所以,我没有看过这本书。 如果你对Swing/Awt感兴趣的话,这本书是你最好的选择。《Java核心编程》、《Java编程思想》两者选其一,没必要两本都看,如果有时间的 话,不若选择一本深读好过两本泛读。
《Java编程语言》Java之父高司令
这本书更多地讲述Java API,对语言的细节没有深入的阐述。不适合入门,但又Java基础的人可以拿过来翻一翻,应该还是会有所收获的。
《Effective Java》中文版
与《Java编程语言》相反,本书介绍了在Java编程中57条极具实用价值的经验规则,目的就是写出更有效Java程序,Java程序员必读之书!
有 点晕了吗?其实学习Java首先应该培养兴趣,兴趣从哪里来?当然是做出自己的
东西,美其名曰做项目。当你完成一个项目,你的成就感、虚荣心及自信心将会 得到最
大的满足。如何做项目,我就不在这里多说了,你到图书馆一搜,一大筐关于J2EE的书将
会映入你的眼帘,挑一个你自己认为不错的书借回来参考,因为 我觉得这些书没有什么
好坏之分,都差不多。
恩,好了,项目也做了,名著也看了,那么接下来做什么呢?是不是觉得万事OK你
已经是Java大牛了。虽然有点夸大,也可以这么说了。不过,Java仍然有更广阔的天地,
这可以从阅读《深入理解Java虚拟机》开始。
《深入理解Java虚拟机》
第 一次读这本书的时候,就感觉它是一本奇书,学习Java怎么能少得了它呢。花了
整整一个星期的时间,如行云流水般的读了这本书,受益匪浅。现在,这本书我 已经看
过几遍了,而且仍然经常拿出来翻一翻,每次看这本书都感觉有所收获。更值得一提的
是,如果你要写Java编译器的话,这本就更必不可少了。
《Java 解惑》英文版
与《c缺陷与陷阱》类似,讲述Java中常常不为人所注意但有时却可能造成系统崩溃
的细微之处。
《Java并发编程实践》
Java并发编程方面最值得读的一本书,但内容理论化太强,需要静下心来慢慢品味,
而且是不断反复阅读才可能领会Java并发的真谛!
《Java编程语言规范》英文版、《JVM规范》英文版
写Java编译器会用到,其他情况下,可以看,亦可以不看。
《Java数据结构与算法》
书已老,内容尚可,期待新版本
《分布式Java应用》
更多讲述Java底层的细节方面,又与企业中实际项目有所关联,暂不推荐看。
java8内存结构图的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于、java8内存结构图的信息别忘了在本站进行查找喔。
发布于:2022-11-24,除非注明,否则均为
原创文章,转载请注明出处。