java原理

 

 Java优点 :

简单、健壮、安全 

跨平台、一次编写到处运行 

高度优化 的虚拟机

缺点: 语法繁琐,无法直接操作硬件,GUI效果不佳 

适用于:

web后端开发 

andro APP开发 

大数据应用开发 

不适用于: 

底层os开发

桌面 应用程序开发 

桌面大型游戏开发 

 

体系 :

 

 

最早是 SUN公司 James,Cosling为手持设备开发的嵌入式编程语言 。

版本 :

java SE: standard Edition

JAVA EE: Enterprise Edition

JAVA ME:Micro Edition

 

 java的版本演进 :

 

java规范 

 

 

 java平台 :

JRE是JDK的一部分.

 

支持环境:

winxp-10,Mac OS x 10.x

Oracle JDK 1.8, Open JDK 1.8

Eclipse/ Intellij Idea/NetBeans 

自己使用: win7,10  Oracle JDK 1.8, Eclipse 

 

JVM: 看直播的JVM讲解

JAVA的GC:

自动垃圾回收.不然加载的类越来越多,heap有上限。
年青代:Young Generation
伊甸园Eden
生存区:Survivor:意思为幸存者,是新生代和老年代的缓冲区域。
伊甸园占满了触发GC,对对象做标记,看哪些在使用哪些没有使用,把没有使用删除掉。然后内存整理压缩
当年青代都站满后,就会触发GC,将生存区的都复制到老年代.
老年代:old Generation
老年带也就扛不住了(空间被用完),那就来次集体大扫除(Full GC)
持久代(元空间)

 

参考:https://www.jianshu.com/p/f36ca4e4bd10    GG

为了进行高效的垃圾回收,虚拟机把堆内存划分成新生代(Young Generation)、老年代(Old Generation)和永久代(Permanent Generation)3个区域。

 

 

新生代
新生代由 Eden 与 Survivor Space(S0,S1)构成,大小通过-Xmn参数指定,Eden 与 Survivor Space 的内存大小比例默认为8:1,可以通过-XX:SurvivorRatio 参数指定,比如新生代为10M 时,Eden分配8M,S0和S1各分配1M。

Eden:希腊语,意思为伊甸园

大多数情况下,对象在Eden中分配,当Eden没有足够空间时,会触发一次Minor GC,虚拟机提供了-XX:+PrintGCDetails参数,告诉虚拟机在发生垃圾回收时打印内存回收日志。

Survivor:意思为幸存者,是新生代和老年代的缓冲区域。
当新生代发生GC(Minor GC)时,会将存活的对象移动到S0内存区域,并清空Eden区域,当再次发生Minor GC时,将Eden和S0中存活的对象移动到S1内存区域。

存活对象会反复在S0和S1之间移动,当对象从Eden移动到Survivor或者在Survivor之间移动时,对象的GC年龄自动累加,当GC年龄超过默认阈值15时,会将该对象移动到老年代,可以通过参数-XX:MaxTenuringThreshold 对GC年龄的阈值进行设置。

老年代
老年代的空间大小即-Xmx 与-Xmn 两个参数之差,用于存放经过几次Minor GC之后依旧存活的对象。当老年代的空间不足时,会触发Major GC/Full GC,速度一般比Minor GC慢10倍以上。

永久代
在JDK8之前的HotSpot实现中,类的元数据如方法数据、方法信息(字节码,栈和变量大小)、运行时常量池、已确定的符号引用和虚方法表等被保存在永久代中,32位默认永久代的大小为64M,64位默认为85M,可以通过参数-XX:MaxPermSize进行设置,一旦类的元数据超过了永久代大小,就会抛出OOM异常。

虚拟机团队在JDK8的HotSpot中,把永久代从Java堆中移除了,并把类的元数据直接保存在本地内存区域(堆外内存),称之为元空间。

 

posted on 2020-02-16 22:17  锋锋2019  阅读(135)  评论(0)    收藏  举报

导航