概述
目录
一、内存垃圾
1.什么是内存垃圾
2.什么是垃圾回收 GC(garbage collection)
二、JVM
1.方法区Method Area(元空间)
2.栈区Stack Area
3.堆区 Heap Area
三、Minor GC和Major GC/Full GC的区别
四、静态类型语言 vs 动态类型语言
五、商品管理系统的设计
1.创建商品类
2.创建测试类Demo
3.测试结果
一、内存垃圾
1.什么是内存垃圾
JVM堆内存中,已经确认不再被使用的内存对象。
2.什么是垃圾回收 GC(garbage collection)
手动gc,JDK提供了一个gc函数,调用这个函数,就完成对JVM虚拟机内存进行一次gc。
System.gc()
自动gc,当JVM虚拟机启动后,后台会自动运行一个gc程序,负责内存的gc操作。
这个后台的gc程序会定时做gc操作,或者是当JVM内存不够用的时候,会立刻出发gc。
主要管堆区
JDK自带的 jvisualvm 工具,安装Visual GC插件
同一个对象可以被多个指针同时指向
一个指针可以指向不同的对象,但是同一时刻只能指向一个对象
1. 指针是可以传递的
从栈中传递到堆区
例如: 领养宠物成功后, 将宠物对象的指针传递到宠物数组中进行存储
随机生成怪物对象后, 将怪物对象的指针传递到怪物数组中进行存储
从栈中传递到另一个栈中
例如: 宠物杀死怪物成功后, 调用宠物的killOk方法, 并把怪物的指针传递
到killOk方法中, 这样可以在killOk方法中通过怪物的指针获取到被杀死的怪物对象中的信息
2. 禁止直接操作对象中的属性, 用成员方法封装操作对象属性的过程
对象中的属性被private封装了
所有操作都应该提供成员方法, 用指针去调用成员方法来操作
例如: 当宠物攻击或被攻击, 怪物攻击或被攻击, 都应该提供对应的成员方法进行调用
测试:
当对象有指针指向的时候,对象不会被垃圾回收器回收
当对象没有指针指向的时候,对象会被垃圾回收器回收(不会被立即回收)
二、JVM
1.方法区Method Area(元空间)
方法区Method Area ---> JDK1.8后改名为元空间Meta Space
存储 字节码文件
2.栈区Stack Area
没有GC垃圾回收,返回后或出异常则自动出栈。
3.堆区 Heap Area
对象在堆区
新生代(回收最频繁的区域)
1.伊甸园区
2.幸存者1区
3.幸存者2区
4. 老年区
会溢出,溢出后报错
程序运行过程中很多对象都是朝生夕死
小对象出生在伊甸园区,gc回收后如果存活下来会被转移到幸存者区,对象的年龄计数器会+1,当对象经历16次回收后依然能够存活,会进入老年代
重对象/大对象 一出生就在老年代
三、Minor GC和Major GC/Full GC的区别
Minor GC发生在新生代的GC
Major GC/Full GC发生在老年代的GC,通常Major GC 发生的时候都伴随着Minor GC的发生,速度比较慢。
在执行GC的时候,所有的线程都会暂停运行,有一句话叫做“stop the wrold! ”
四、静态类型语言 vs 动态类型语言
静态(程序未运行时的状态)类型语言:
任何一个变量在定义的时候就必须指定其数据类型,并且数据类型不允许改变。
动态(程序运行的状态)类型语言:
变量的类型是程序运行的时候才知道。
五、商品管理系统的设计
1.创建商品类
public class Goods {
private String name;
private Integer price;
private String description;
private Long stock;
private String category;
private String state;
public Goods() {
}
public void show(){
System.out.println("*****" + this.name + "的信息" + "*****");
System.out.println("商品价格:" + this.price);
System.out.println("商品描述:" + this.description);
System.out.println("商品库存:" + this.stock);
System.out.println("商品分类:" + this.category);
System.out.println("商品状态:" + this.state );
System.out.println();
}
public Goods(String name, Integer price, String description, Long stock, String category, String state) {
this.name = name;
this.price = price;
this.description = description;
this.stock = stock;
this.category = category;
this.state = state;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getPrice() {
return price;
}
public void setPrice(Integer price) {
this.price = price;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public Long getStock() {
return stock;
}
public void setStock(Long stock) {
this.stock = stock;
}
public String getCategory() {
return category;
}
public void setCategory(String category) {
this.category = category;
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
}
2.创建测试类Demo
import java.util.Scanner;
public class Demo01 {
static Scanner sc = new Scanner(System.in);
static Goods[] goodsArr = new Goods[10]; //定义了一个商品类型的数组,初始长度为10
public static void main(String[] args) {
int choice = 0;
do{
System.out.println("*****欢迎来到坤坤商品管理系统*****");
System.out.println("1.添加商品1");
System.out.println("2.添加商品2");
System.out.println("3.查看商品");
System.out.println("4.商品数组扩容");
System.out.println("5.退出");
System.out.println("请选择:");
choice = sc.nextInt();
switch (choice){
case 1:
addGoods1();
break;
case 2:
addGoods2();
break;
case 3:
display();
break;
case 4:
dilatation();
break;
}
}while(choice != 5);
System.out.println("byebye~鸡你太美");
}
//添加商品方法1
private static void addGoods1() {
if(goodsArr[goodsArr.length-1] != null){
System.out.println("商品已登记满,请扩容!");
return;
}
System.out.println("请输入商品名称:");
String name = sc.next();
System.out.println("请输入商品价格:");
int price = sc.nextInt();
System.out.println("请输入商品的描述:");
String description = sc.next();
System.out.println("请输入商品库存:");
int stock = sc.nextInt();
System.out.println("请输入商品分类:");
String category = sc.next();
System.out.println("请输入商品状态:");
String state = sc.next();
Goods goods = new Goods(name,price,description, (long) stock,category,state);
for (int i = 0; i < goodsArr.length; i++) {
if(goodsArr[i] == null){
goodsArr[i] = goods;
break;
}
}
System.out.println("商品信息添加成功:");
}
//添加商品方法2
private static void addGoods2() {
Goods goods = new Goods();
System.out.println("请输入商品名称:");
String name = sc.next();
System.out.println("请输入商品价格:");
int price = sc.nextInt();
System.out.println("请输入商品的描述:");
String description = sc.next();
System.out.println("请输入商品库存:");
int stock = sc.nextInt();
System.out.println("请输入商品分类:");
String category = sc.next();
System.out.println("请输入商品状态:");
String state = sc.next();
goods.setName(name);
goods.setPrice(price);
goods.setDescription(description);
goods.setStock((long) stock);
goods.setCategory(category);
goods.setState(state);
for (int i = 0; i < goodsArr.length; i++) {
if(goodsArr[i] == null){
goodsArr[i] = goods;
break;
}
}
}
//商品数组扩容
private static void dilatation(){
System.out.println("扩容前商品栏位长度:" + goodsArr.length);
Goods[] newgoodsArr = new Goods[goodsArr.length * 2];
//每次扩容2倍
for (int i = 0; i < goodsArr.length; i++) {
newgoodsArr[i] = goodsArr[i];
}
goodsArr = newgoodsArr;
System.out.println("扩容后商品栏位长度:" + goodsArr.length);
}
//遍历商品
private static void display() {
for (int i = 0; i < goodsArr.length; i++) {
if(goodsArr[i] == null) {
System.out.println((i+1) + "号商品:未登记");
}else {
System.out.println((i+1) + "号商品:" + goodsArr[i].getName());
}
}
}
}
3.测试结果
最后
以上就是感性墨镜为你收集整理的JAVA学习DAY-6一、内存垃圾二、JVM三、Minor GC和Major GC/Full GC的区别四、静态类型语言 vs 动态类型语言五、商品管理系统的设计的全部内容,希望文章能够帮你解决JAVA学习DAY-6一、内存垃圾二、JVM三、Minor GC和Major GC/Full GC的区别四、静态类型语言 vs 动态类型语言五、商品管理系统的设计所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复