首页 > 代码库 > java基本概念
java基本概念
一、JVM和jdk概念说明:
1.JVM是Java虚拟机,所有的Java程序都在Java虚拟机中运。
2.JDK是Java开发工具包,用来开发Java程序,是整个Java的核心,包括了Java运行环境、Java工具和Java基础类库
3.jdk中有一个编译器,可以把你的java源代码编译成可以在虚拟机(jvm)上运行的字节码(中间代码).
二、heap和stack的概念区分
1.heap是堆,stack是栈。
2.heap的空间是手动申请和释放的,heap常用new关键字来分配。stack的空间由操作系统自动分配和释放。
3.heap的空间是很大的自由区,stack空间有限。在Java中,若只是声明一个对象,则先在栈内存中为其分配地址空间,若再new一下,实例化它,则在堆内存中为其分配地址。
声明对象(栈中分配地址空间)====》实例化(堆heap中分配地址空间)
4.举例:数据类型 变量名;这样定义的东西在栈区。如:Object a =null; 只在栈内存中分配空间
new 数据类型();或者malloc(长度); 这样定义的东西就在堆区如:Object b =new Object(); 则在堆内存中分配空间
5.面向对象和堆栈的关系:当我们把对象拆开,你会发现,对象的属性其实就是数据,存放在堆中;而对象的行为(方法),就是运行逻辑,放在栈中。我们在编写对象的时候,其实就是编写了数据结构,也编写了处理数据的逻辑。
6.堆中存的是对象。栈中存的是基本数据类型和堆中对象的引用。一个对象的大小是不可估计的,或者说是可以动态变化的,但是在栈中,一个对象只对应了一个4byte的引用(堆栈分离的好处)。
JVM的heap
JVM堆的设置是指java程序运行过程中JVM可以调配使用的内存空间的设置.JVM在启动的时候会自动设置Heap size的值,其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4。可以利用JVM提供的-Xmn -Xms -Xmx等选项可进行设置。例如:java -jar -Xmn16m -Xms64m -Xmx128m MyApp.jar如果Heap Size设置偏小,除了这些异常信息外,还会发现程序的响应速度变慢了。Heap Size 最大不要超过可用物理内存的80%,一般的要将-Xms和-Xmx选项设置为相同,wiki的设置为-Xms30g -Xmx30g,物理内存为96G
三、垃圾回收(GC)
GC经常发生的区域是堆区,堆区还可以细分为新生代、老年代,新生代还分为一个Eden区和两个Survivor区。
1.1 对象优先在Eden中分配,当Eden中没有足够空间时,虚拟机将发生一次Minor GC,因为Java大多数对象都是朝生夕灭,所以Minor GC非常频繁,而且速度也很快;
1.2 Full GC,发生在老年代的GC,当老年代没有足够的空间时即发生Full GC,发生Full GC一般都会有一次Minor GC。大对象直接进入老年代,如很长的字符串数组,虚拟机提供一个-XX:PretenureSizeThreadhold参数,令大于这个参数值的对象直接在老年代中分配,避免在Eden区和两个Survivor区发生大量的内存拷贝;
1.3 发生Minor GC时,虚拟机会检测之前每次晋升到老年代的平均大小是否大于老年代的剩余空间大小,如果大于,则进行一次Full GC,如果小于,则查看HandlePromotionFailure设置是否允许担保失败,如果允许,那只会进行一次Minor GC,如果不允许,则改为进行一次Full GC
参考:https://zhidao.baidu.com/question/1864149247064670867.html
https://zhidao.baidu.com/question/1864149247064670867.html
java基本概念